优化mysql内连接查询以使用索引

时间:2015-01-12 13:54:45

标签: mysql query-optimization

我有一个非常简单的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"中的更多产品类别关系;表这个查询永远持续下去。

我定义了以下索引/主键:

  • table" product" - 主键(id_product)
  • table" product_category" - 主键(id_product,id_category),索引(id_product),索引(id_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 - 我认为这就是为什么一切都运行得这么慢的问题。

由于此查询多次从闭源软件执行,因此我无法对其进行更改。但我想优化表/索引,以便此查询运行得更快。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

id_category上有一个常量条件,id_product中有一个JOIN条件。

我相信如果你在(id_category, id_product)上创建索引,按此顺序,MySQL将能够找到类别1234的相关索引条目,并使用它们来查找相关的product_id来获取两张桌子。

不幸的是我现在无法测试这个 - 我可以稍后再试。 如果你可以尝试一下,你会很快发现......