2011-01-23 3 views
0

私は2つのテーブルに左の結合ステートメントを持っています:tbl1は約100万レコード、tbl2は約2000万です。クエリの実行に約9秒かかります。私は両方にインデックスを持っていますが、クエリーの時間の長さを考えれば、何かが正しく見えません。ここに私のselect文は次のとおりです。私のデータベースやクエリを何とか高速化する必要があります

EXPLAIN SELECT * FROM (SELECT tbl1.id, tbl1.name, tbl2.addr FROM tbl1 LEFT JOIN tbl2 ON tbl2.id = tbl1.id WHERE tbl1.name LIKE 'G%' AND tble2.addr IS NOT NULL) as tempTable GROUP BY id LIMIT 10; 

+----+-------------+------------+--------+------------------+--------------+---------+----------------| 
id|select_type| table  |type |poss_keys|key |key_len|ref   | rows | Extra 
+----+-------------+------------+--------+------------------+--------------+---------+---------------- 
1 | PRIMARY | <derived2>|system| NULL |NULL| NULL |NULL  | 0 | const row not found | 
2 | DERIVED | tbl1  |range |id,name |name| 903 |NULL  | 1 | Using where   | 
2 | DERIVED | tbl2  |ref |id,addr |id | 4  |tbl2.tbl1.id| 25 | Using where   | 
+----+-------------+------------+--------+------------------+--------------+---------+---------------- 

UPDATE: 私は結合文&を取る場合は、単にselect文は(も1秒未満)に高速である個別TBL1から、またはTBL2からレコードを選択するが、私は参加しようとすると、彼らはそれをonsiderably遅く...私はそれらを正しく結合するか、私は結合のための特別なインデックスのいくつかの種類が必要ですか?あなたは少しそれを簡素化するかもしれない

+1

1.なぜネストされたクエリが必要ですか? 2.なぜLEFT JOINを使うのですか? 3.テーブル構造はどこにありますか? – zerkms

+0

左結合は、2つのテーブルを結合するために使用されます。私はテンポラリテーブルは必要ないと思うが、文を変更してもクエリにはまだ長い時間がかかります –

答えて

1

インデックスが動作しない場合は...私は...また...あなたは一時テーブルまたはグループを必要

SELECT tbl1.id, tbl1.name, tbl2.addr 
FROM tbl1 LEFT JOIN tbl2 ON tbl2.id = tbl1.id 
WHERE tbl1.name LIKE 'G%' AND tble2.addr IS NOT NULL 

を考えていませんあなたはO

mysql_unbuffered_query 

使用してみてください多くの他の方法

あなたが試すことができ

+0

彼は 'LEFT JOIN' +' tble2.addr IS NOT NULL'も必要ありません。 – zerkms

+0

なぜ彼は 'LEFT JOIN'と' tble2.addr IS NOT NULL'を必要としないのか説明できますか? – arnaud576875

+0

thxですが、この文は問題の根源には見えません。あなたの提案に変更すると同様の速度になります。 –

0

" 'Gの%' のようtble2.id" を追加することができますそれはより速くあなたが、10はこれ以上あなたはSQL_SMALL_RESULTオプションを使用すると、結果はわずか10結果

SQL_SMALL_RESULT 

が含まれているとしてカウントはその後

を必要とされる服用としてMySQLを制限を指定しているとして、私だと思うようになりますnはPHP側メモリ内の一時テーブルを使用します。小さな結果のクエリを高速化する

+0

thx。私はPHPを使用していますが、 "mysqli_stmt_execute($ q)"の形式の私のステートメントでバッファリングされていないクエリを使用する方法はかなりわかりません... SQL_SMALL_RESULTに関しては、バージョン3.23以降 –

+0

mysql_unbuffered_query($ query); mysql_query($ query)のように – Harish

関連する問題