MySQL 多条件多排序查询优化

查看:178
本文介绍了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


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


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组成一个超大索引

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

这篇关于MySQL 多条件多排序查询优化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆