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

优化mysql内部连接查询以使用索引,mysql,query-optimization,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”表中有很多产品,在“product\u c

我有一个非常简单的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”表中有很多产品,在“product\u category”表中有更多的产品类别关系,所以这个查询将永远持续下去

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

  • 表“产品”-主键(id\U产品)
  • 表“产品类别”-主键(标识产品、标识类别)、索引(标识产品)、索引(标识类别)
但当我解释这个问题时,我得到:

+----+-------------+-------+--------+--------------------+------------+---------+------------------------+-------+----------------------------------------------+
| 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—我认为这就是为什么所有东西都运行得如此缓慢的问题


由于这个查询在一个封闭源代码的软件中执行了很多次,所以我无法更改它。但我想优化表/索引,以便此查询运行得更快。感谢您的帮助。

您在id\u类别中有一个恒定条件,在id\u产品中有一个联接条件

我相信,如果您在
(id\u category,id\u product)
上创建一个索引,按照这个顺序,MySQL将能够找到类别1234的相关索引项,并使用它们找到相关的
产品id
以从两个表中获取

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

删除GROUP BY子句。如我所说,我无法更改查询,因为它源自封闭源代码软件。因此,我唯一的解决方案是优化表