查询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 哪个效果更好?
查询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 哪个效果更好?
看到大神的回复,正好最近在学习相关知识.以下说一下我的理解.
如果是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列数据唯一,我认为效率应该相似.
5 回答3.3k 阅读✓ 已解决
3 回答3.7k 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
两种效率其实都挺好的
一定要比一下的话理论上应该是idx_a_b更好
sql的执行顺序是where先于order
所以同样是取100条数据应该是直接定位目标效率最高