我正在用下面的查询来查询数据库。此查询需要21秒才能执行。
我已经通过explain查询检查过了。我有索引字段groupId,batchId分别。
EXPLAIN SELECT message, sentOn, maskId, isDndCheck, contentType
FROM sms_histories
WHERE groupId = 1750
GROUP BY batchId
ORDER BY batchId DESC
LIMIT 0 , 1我正在通过这个查询得到群的上一篇文章。
我的explain查询显示了结果
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sms_histories index groupId batchId 5 NULL 888 Using where 请告诉我问题是什么,为什么这个查询花了这么长的时间?
发布于 2010-09-09 19:57:36
我认为你应该像博恩斯说的那样,在batchId和groupId上使用复合索引。我认为在您的表sms_histories中会有很多数据。正如波本斯所说,你使用的是有点笨拙的数据库模式。您应该尝试对其进行规范化,并从中删除副本。在开始一个新项目之前,您应该更多地关注数据库模式。所以主要的事情是同时在batchId和groupId上建立索引。
发布于 2010-09-09 18:27:10
我注意到groupId是CHAR类型。您需要在groupId字段上使用升序索引。但是,如果可能的话,请考虑将GroupId的类型更改为整数。
发布于 2010-09-09 18:40:54
要使ORDER BY optimisation正常工作,您需要在(groupId, batchId)上使用复合索引。MySQL不能单独使用batchId索引,因为所有不同的groupId都混在其中。
(不过,我对查询应该做什么感到有点困惑。您有不带聚合列的GROUP BY。如果batchId是sms_histories的主键,那么GROUP BY看起来什么也不做。如果它不是主键,那么查询就是无效的SQL,MySQL将以半随机的方式返回一行。)
https://stackoverflow.com/questions/3675685
复制相似问题