2016-09-21 22 views
-1

私は2つのテーブルを持っていますが、1つは200万、もう1つは3000万レコードです 両方のテーブルのレコードを比較する必要がありますが、これは非常に遅いです。Mysql/PHPのクエリ速度を向上させる

誰でも高速化の方法を提案できますか?

<?php 
$con = mysql_connect("localhost","root","password"); 
mysql_select_db("DMBONE", $con); 
$result = mysql_query("SELECT * FROM sucid where priority=''"); 
while($row = mysql_fetch_array($result)) 
{ 
$result1 = mysql_query("SELECT count(*) FROM bills_logic where month(tdate)=8 and x1=".$row[0].""); 
if($row1 = mysql_fetch_array($result1)) 
{ 
if($row1[0]==0) 
{ 
echo $row[0]." DEAD\r\n"; 
mysql_query("update sucid set priority='DEAD' where bid=".$row[0]."") or die(mysql_error()); 
} 
else 
{ 
echo $row[0]." ".$row1[0]."\r\n"; 
mysql_query("update sucid set priority='".$row1[0]."' where bid=".$row[0]."") or die(mysql_error()); 
} 
} 
} 
?> 


CREATE TABLE `sucid` (
`bid` varchar(500) NOT NULL, 
`priority` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

    CREATE TABLE `bills_logic` (
`bid` int(11) NOT NULL AUTO_INCREMENT, 
`num` varchar(500) NOT NULL, 
`stat` varchar(500) NOT NULL, 
`tdate` varchar(500) NOT NULL, 
`x1` varchar(500) NOT NULL, 
`amt` varchar(500) NOT NULL DEFAULT '30', 
PRIMARY KEY (`bid`) 
) ENGINE=InnoDB AUTO_INCREMENT=35214848 DEFAULT CHARSET=latin1 

は、テーブルのcreate tableステートメントです。

答えて

0

joinの世界で最も遅い方法が見つかりました。あなたはそれを昔ながらの方法(ただし、mysqliを使用するだけでおしゃれに十分な)を行うために幸せになることがあります。

<?php  
    $mysqli = new mysqli("localhost","root","password","database"); 
    if ($mysqli->connect_errno) { 
    printf("Connect failed: %s\n", $mysqli->connect_error); 
    exit(); 
    } 

    $sql = "update sucid 
      left join (
      select count(*) as priority, x1 
      from bills_logic b 
      where month(tdate)=8 
      group by x1 
     ) bg 
      on bg.x1 = sucid.bid 
      set sucid.priority = coalesce(bg.priority,'DEAD');" 

    if ($mysqli->query($sql) === TRUE) { 
    printf("I'm done already. This was fast, wasn't it?\n"); 
    } 
    else { 
    echo "Something went wrong: " . $mysqli->error . "\n"; 
    exit(); 
    } 

?> 

あなたはそれがここにはあまり助けにはなりませんが、bills_logic.x1にインデックスを追加したい場合があります。

実際に列を修正する必要があります。 tdatevarchar(500)であってはなりません。無効な日付の行があると、更新が完全に失敗します。正しいデータ型を使用すると、無効な値を持つことができなくなります。 num,とamtのように聞こえるかもしれません。int(またはおそらくdecimal)、x1でもかまいません。 priority - DEAD0に置き換えた場合は、intとしても機能します。

+0

ありがとう、これを試してみます –

+0

魅力的なように働いて、私は本当に私のSQLにブラッシュアップする必要があります。 –

0

索引を作成することをお勧めします。特に、検索を区切るために使用している値については、作成することをお勧めします。具体的には、フィールド優先度のインデックスを作成します。

インデックスでmysqlを扱う方法の詳細については、hereを参照してください。

0

ええ、大きな問題がある可能性があります。速度とクエリのパフォーマンスは、次の要素に依存します。

  1. データベーススキーマテーブルの構造。
  2. マシンハードウェア仕様。
  3. あなたのお問い合わせの構造。
  4. テーブルインデックス。

希望しているすべてデータベースのエキスパートは、blobをプライマリテーブルと同じテーブルに含めません。フェッチするデータが何百万もあると話すとき、これはすべてのデータベースの大きな問題です。 BLOBデータをベストプラクティスとして常に分離する方がはるかに優れています。

これは単なる追加情報です。他の人に役立つことを望みます。

関連する問題