问题描述
我有一个包含 30M 行的大表(每天都在增加)。该表包括一些字段,例如id
、stationId
、sentAt
(日期时间)、isApproved
(tinyint)、...我索引列(stationId
、 sentAt
).
这是我的查询:
Select id,stationId,sentAt,isApproved
from monitoring_data_info
where stationId = 'akhdsjha12'
and isApproved = 1
order by sentAt DESC
limit 1
数据库浪费了很多时间来返回结果,因为它必须搜索整个数据集来与条件isApproved
= 1进行比较。所以我的问题是:
- 我应该索引
isApproved
列的 50% 为 1 吗? - 有没有办法优化这个查询?
解决方法
您要添加此索引:
ALTER TABLE monitoring_data_info
ADD INDEX (stationId,isApproved,sentAt);
索引中列的顺序很重要:
-
前两列会将搜索减少到仅匹配的行。
-
第三列将确保按照您想要返回的顺序读取行,因此 ORDER BY 将是空操作。
您可能喜欢我的演示文稿 How to Design Indexes,Really 或 video of me presenting it。我解释了如何使用这样的索引优化查询。