0

我有ProductInfo以下索引的表 -

Primary:  ProductCode, Model, Added_Date, id
Index: id

复合主键是我在以下查询中使用的列

SELECT * FROM ProductInfo WHERE 
ProductCode='45678' AND 
Model='PQA-1'  AND 
(Added_Date >='2021-08-01 00:00:00' AND Added_Date <='2021-08-14 23:59:59') 
ORDER BY Added_Date ASC;

这个查询工作得很好

问题

下面的查询很快

select * from ProductInfo WHERE ProductCode="45678" order by id desc limit 1;

这里是解释 在此处输入图像描述

但是下面的查询非常非常慢。请注意,查询是相同的,但只是ProductCode不同

select * from ProductInfo WHERE ProductCode="78342" order by id desc limit 1;

这是解释。 在此处输入图像描述

但是,使用限制 2 的相同查询很快

select * from ProductInfo WHERE ProductCode="78342" order by id desc limit 2;

这里是解释 在此处输入图像描述

原因是什么?我的索引是否正确?解决方案是什么?

谢谢

4

1 回答 1

0

第一个查询受益于这个索引:

PRIMARY KEY(ProductCode, Model, Added_Date)

所有其他查询都无法从您的任何一个索引中完全受益。优化器在一种情况下猜测一个索引;另一个索引中的另一个。这对两种情况都有效:

INDEX(ProductCode, Id)

时间差异的一个原因是表中数据的分布。如果您将 更改为其他值,您的示例可能不会显示相同的时间。78342

我推荐的新索引将使这些查询“快速”,而不管搜索的 ProductCode 是什么。并且“行”会说“1”或“2”而不是“25000”。

听起来大约有 25K 行ProductCode = 78342

于 2021-08-15T19:17:43.757 回答