2

内部結合を使用した簡単なクエリがあります。結合されるテーブルには、1500行と2500行があります。両方のテーブルに主キーがあります。このキーでは結合は行われません。

このクエリの結果セットには1500行があります。このクエリを実行すると、20秒かかります...(永遠

SELECT so.order_id
FROM   shop_orders so
       INNER JOIN shop_order_payments sop
          ON so.order_code = sop.order_code
WHERE  sop.status = 9
ORDER  BY date_created DESC

最後に「LIMIT1500」を追加すると、クエリは1秒しかかかりません。(削除すると再び20秒かかるので、キャッシュではありません...)

  1. どうしてこれなの ?
  2. そして、このクエリの結果の行数をすばやく確認する方法はありますか?

注:このクエリは、mysql()関数を使用してphpスクリプトで実行します)

* update1:​​EXPLAINの結果

idselect_typeテーブルタイプpossible_keyskeykey_len ref rows Extra
1 SIMPLE sop ALL NULL NULL NULLNULL1153使用場所; 一時的な使用; filesortの使用
1 SIMPLE so ALL NULL NULL NULLNULL2529ここでの使用

  • アップデート2:

コメントで要求されたようにDESCを実行しました

Payment_id --int(11)PRIなしauto_increment
タイムスタンプ-タイムスタンプNOCURRENT_TIMESTAMP   
order_code-varchar(100)NO         
受け入れ-varchar(50)いいえ         
金額-varchar(20)いいえ          

つまり、プライマリインデックスのみが表示されますが、これはインデックスとしては十分ではありませんか?

4

1 に答える 1

1

EXPLAIN、クエリがインデックスを使用していないことを示しています。したがって、フルテーブル スキャンが実行され、速度が低下します。

このステートメントを実行してみてください。

ALTER TABLE shop_orders ADD INDEX td_idx (order_code);
ALTER TABLE shop_order_payments ADD INDEX td2_idx (order_code);

SELECTクエリを再度実行します。

更新 1

テーブルにはインデックスがありますがpayment_id、結合が column を使用しているため、この場合は使用されていない column にありますorder_code。その列に索引も定義する必要があります。

于 2013-01-12T12:25:23.347 に答える