首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在为此mysql查询编制索引

问正在为此mysql查询编制索引
EN

Stack Overflow用户
提问于 2010-09-09 18:21:46
回答 3查看 119关注 0票数 3

我正在用下面的查询来查询数据库。此查询需要21秒才能执行。

我已经通过explain查询检查过了。我有索引字段groupId,batchId分别。

代码语言:javascript
复制
EXPLAIN SELECT message, sentOn, maskId, isDndCheck, contentType
FROM sms_histories
WHERE groupId = 1750
GROUP BY batchId
ORDER BY batchId DESC
LIMIT 0 , 1

我正在通过这个查询得到群的上一篇文章。

我的explain查询显示了结果

代码语言:javascript
复制
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 

请告诉我问题是什么,为什么这个查询花了这么长的时间?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-09 19:57:36

我认为你应该像博恩斯说的那样,在batchId和groupId上使用复合索引。我认为在您的表sms_histories中会有很多数据。正如波本斯所说,你使用的是有点笨拙的数据库模式。您应该尝试对其进行规范化,并从中删除副本。在开始一个新项目之前,您应该更多地关注数据库模式。所以主要的事情是同时在batchId和groupId上建立索引。

票数 1
EN

Stack Overflow用户

发布于 2010-09-09 18:27:10

我注意到groupId是CHAR类型。您需要在groupId字段上使用升序索引。但是,如果可能的话,请考虑将GroupId的类型更改为整数。

票数 1
EN

Stack Overflow用户

发布于 2010-09-09 18:40:54

要使ORDER BY optimisation正常工作,您需要在(groupId, batchId)上使用复合索引。MySQL不能单独使用batchId索引,因为所有不同的groupId都混在其中。

(不过,我对查询应该做什么感到有点困惑。您有不带聚合列的GROUP BY。如果batchId是sms_histories的主键,那么GROUP BY看起来什么也不做。如果它不是主键,那么查询就是无效的SQL,MySQL将以半随机的方式返回一行。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3675685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档