mysql索引加在where上效果更好,还是order上效果更好?

storyflow
  • 309

查询sql:
1、select * from table where a and b limit 100;
2、select * from table where a order by c desc limit 100;

现在只能建立一个索引
联合索引 idx_a_b VS idx_a_c 哪个效果更好?

回复
阅读 2.5k
3 个回答

两种效率其实都挺好的
一定要比一下的话理论上应该是idx_a_b更好
sql的执行顺序是where先于order
所以同样是取100条数据应该是直接定位目标效率最高

索引优先建在where的过滤条件字段上,如果过滤条件字段能够是结果集大大缩小,才能有效的使用索引。

具体情况可以自己对比一下执行计划及响应时间。

看到大神的回复,正好最近在学习相关知识.以下说一下我的理解.
如果是mysql的话,其实建立索引就是建立B+树的问题,一般来说,索引上的非叶子页都会保存在内存中,因此寻找相关数据显得很快,也因B+树的特性,添加索引对于需要有order by列的条件非常有利.
这里select * ,假设该表不仅只有a和b字段,假设一般情况下叶子页存放在磁盘上,那么很容易根据B+树的特性得到以下结论:
1.sql1只需要查询部分数据,然后回表查询.
2.sql2如果走index_a_c,如果a是范围查询,则得到的c可能要排序,使用的效果很不好.但是如果a是等值查询,则效果最好.
其他影响因素:a,b,c列的大小,这个很关键,直接影响了索引的大小.
查询条件本身,是否选择出太多数据,abc列本身的可选择性.mysql优化器在判断结果集大于整个表行的20%的时候,是不走索引的,这又要说到顺序io的问题.
还有很多因素,一个单纯的sql,没有条件和整个表的情况,难以判断,如果条件都明朗且唯一,比如a,b,c列的情况一致,即index_a_b和index_a_c一样,查询的a,b是等值查询,a,b列数据唯一,我认为效率应该相似.

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