MySQL 多条件多排序查询优化

1.一个单表查询如下图
SELECT

*

FROM

t_content_main

WHERE

(
    article_category_id = '1607'
    AND review_status = '1'
    AND is_delete = '0'
)

ORDER BY

is_stick DESC,
release_time DESC,
update_time DESC

LIMIT 0,12

clipboard.png

clipboard.png
2.请问各位大牛改如何优化(加过索引,状况不太好)
3.强制使用索引以后变成一下这样 Sending data非常慢

clipboard.png

clipboard.png
4.索引图

clipboard.png

阅读 9.9k
4 个回答

首先要说你建的索引是有问题的,where条件字段和order字段顺序影响很大,并且是不是需要把所有字段都加进去也有待商榷,你首先要确认你的结果集有多少(不进行limit的时候),如果结果集比较小的话,首选索引字段就是where条件里面的字段,就比如你的article_category_id、review_status、is_delete这三个字段,按照筛选率决定索引字段的顺序,筛选率高放在前面,如果排序时间还是很长的话那就把你的排序字段再加到索引里,记住要按顺序放在where字段的后面,一定。另一种情况如果你的结果集很大的话,比如已经占到了整表数据的很大一部分了,这时候limit就有用了,这时候按照排序字段加索引就比较合适了,再limit的作用下只需要找到满足条件的limit数目的记录即可,再差点你把where条件的字段加在排序字段后面会更快一点。不过看你的结果是把where条件字段加在了order字段后面,效率更低,这就说明了where条件的筛选率还是比较高的,才会导致按照排序索引的检索效率更差,所以综上所述:按照article_category_id、review_status、is_delete这三个字段价格索引应该就满足你需求了,不嫌索引占地方就把排序字段也加后面也没关系,就是这样article_category_id,review_status,is_delete,is_stick,release_time,update_time组成一个超大索引

说的有点多,不知道说明白没有。。也不知道你能不能看懂。。

首先你也米有说明是什么engine,第二个也没有给出怎么建立的索引;
解决该问题在于能否要建立合适的联合索引(多字段索引)来优化排序,利用索引的已排序性

字段article_category_id和is_stick和release_time和update_time建立联合索引试试,其他字段不用建重复性太高,建索引没用

感觉是索引有问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题