我有一个非常简单的Mysql查询,它输出按价格降序排序的类别的产品。
SELECT
p.id_product, p.price
FROM product p
INNER JOIN product_category pc
ON (pc.id_product = p.id_product AND pc.id_category=1234)
GROUP BY pc.id_product
ORDER BY p.price DESC
因为我在"产品"中有很多产品。表格以及" product_category"中的更多产品类别关系;表这个查询永远持续下去。
我定义了以下索引/主键:
但是当我解释这个问题时,我得到了:
+----+-------------+-------+--------+--------------------+------------+---------+------------------------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+--------------------+------------+---------+------------------------+-------+----------------------------------------------+
| 1 | SIMPLE | pc | index | PRIMARY,id_product | id_product | 4 | NULL | 73779 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | p | eq_ref | PRIMARY | PRIMARY | 4 | mydb.pc.id_product | 1 | |
+----+-------------+-------+--------+--------------------+------------+---------+------------------------+-------+----------------------------------------------+
所以...使用临时;使用filesort - 我认为这就是为什么一切都运行得这么慢的问题。
由于此查询多次从闭源软件执行,因此我无法对其进行更改。但我想优化表/索引,以便此查询运行得更快。任何帮助表示赞赏。
答案 0 :(得分:0)
id_category上有一个常量条件,id_product中有一个JOIN条件。
我相信如果你在(id_category, id_product)
上创建索引,按此顺序,MySQL将能够找到类别1234的相关索引条目,并使用它们来查找相关的product_id
来获取两张桌子。
不幸的是我现在无法测试这个 - 我可以稍后再试。 如果你可以尝试一下,你会很快发现......