「orders_products」という名前の mySQL テーブルがあり、次の関連フィールドがあります。
- products_id
- orders_id
両方のフィールドにインデックスが付けられます。
次のクエリを実行しています。
SELECT products_id, count( products_id ) AS counter
FROM orders_products
WHERE orders_id
IN (
SELECT DISTINCT orders_id
FROM orders_products
WHERE products_id = 85094
)
AND products_id != 85094
GROUP BY products_id
ORDER BY counter DESC
LIMIT 4
このクエリは非常に長く、約 20 秒かかります。それ以外の場合、データベースはあまりビジーではなく、他のクエリでうまく機能します。
疑問に思っているのですが、クエリが非常に遅くなる原因は何ですか?
テーブルがかなり大きい (約 1,500 万行、サイズ約 210 MB)、これはメモリの問題でしょうか?
mySQL に時間がかかっていることを正確に知る方法はありますか?
Explain の出力:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY orders_products range products_id products_id 4 NULL 1577863 Using where; Using temporary; Using filesort
2 DEPENDENT SUBQUERY orders_products ref orders_id,products_id products_id 4 const 2 Using where; Using temporary