2

ここでこれを選択します:

select parent_id from sales_flat_order_status_history where status like '%whatever%' group by parent_id having count(parent_id) > 1

このクエリは数秒しか実行されません。次のように、別の選択で使用したいと思います。

select increment_id from sales_flat_order where entity_id in(
select parent_id from sales_flat_order_status_history where status like '%whatever%' group by parent_id having count(parent_id) > 1)

これは永久に実行されるため、ID を 1 つずつ挿入してみました。

select increment_id from sales_flat_order where entity_id in(329,523,756,761,763,984,1126,1400,1472,2593,3175,3594,3937,...)

これは高速に実行されます。違いはどこにあり、どうすれば最初のアプローチをより高速に動作させることができますか?

ありがとう!

4

2 に答える 2

3

サブクエリを実行し、すべての行の sales_flat_order テーブルを検索しているため、クエリの実行に時間がかかっています。

参加はおそらくより速くなります:

select increment_id 
from sales_flat_order
  inner join (select parent_id 
              from sales_flat_order_status_history 
              where status like '%whatever%' 
              group by parent_id having count(parent_id) > 1) Sub 
  on sales_flat_order.entity_id  = Sub.parent_ID

これにより、サブクエリが 1 回だけ実行されます。

于 2012-08-14T13:01:09.197 に答える
1

サブクエリは foreach スタイルで処理されます (行ごとにサブ選択を行います)。

in (1,2,3)一部の古いバージョンの mysql ではインデックスを使用しないように考えています。

于 2012-08-14T12:56:35.423 に答える