【发布时间】:2013-07-09 13:33:24
【问题描述】:
给定一个名为“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 秒。否则数据库不是很忙,并且在其他查询上表现良好。
我在想,是什么原因导致查询这么慢?
表相当大(大约 150 万行,大小大约 210 mb),这可能是内存问题吗?
有没有办法准确判断 mySQL 花了这么长时间?
解释的输出:
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
【问题讨论】:
-
EXPLAIN?你能发布解释输出吗?
-
你有关于 orders_id 和 products_id 的索引吗?
-
提供表结构、索引和查询目的或预期输出。
-
orders_id 和 products_id 都有索引。添加了对问题的解释输出。
-
啊,我的老朋友“使用文件排序”。尝试删除
ORDER看看是否有帮助,至少作为隔离问题的一种方式。
标签: mysql sql query-performance where-in