有一张表,建立了一个组合索引,比如:userId,userType,orgId这三个字段组合,顺序也是这样的,然后写sql的时候这样写的:
select * from user where userType=0 and userId=1;
同事说这样写索引使用的效率不高,建立索引的时候字段是什么顺序就要按照顺序来,所以要把后面的where条件改为 userId=1 and userType=0才可以,真的是这样吗?以前还真没注意过
@风吹屁屁凉
: MySQL的索引机制不太清楚,对DB2比较了解。DB2的组合索引A+B+C,对于条件A, A+B, A+B+C都会使用索引,如果索引定义的时候允许反向扫描,那么C, C+B也会使用索引,其他情况不会使用这条索引的。
自己建了个表试了一下,使用联合索引的话,如果查询所有的列,那么第一个索引一定要加上,否则不会使用索引,如果只查询这几个建立索引的列,则会使用索引,如果是联合索引的话使用还是要根据实际情况来
列基数,是指它所容纳的所有非重复值的个数,可以理解为 distinct(某列)后的结果,比如某个列包含值1,3,7,4,7,3,那么它的基数就是4了,列基数越大,重复值越少,需要建索引,因为如果某列的值都是重复的就没必要建索引了是(`DistriType`,`DistriButTime`) 这样建?还是这样建 (`DistriButTime`,`DistriType`) ?
count一下就知道了
count(distinct DistriType) 与 count(distinct DistriButTime)比较猜测肯定是前者<后者,所以联合索引把DistriTyp放左边更优。参考资料:
http://edu.51cto.com/course/course_id-5053.html
这不是存储引擎调整好么。。是SQL执行优化器优化了语句好么,实际执行的时候是把语句改成了
select * from user where userId=1 and userType=0;
从而适应myqsl索引最左匹配原则,而执行优化器的这些操作,每一个MYSQL版本优化的力度都是不同的,也许你换一个旧一点的版本他就不帮你优化了呢,这会你要往哪哭去?所以,在了解原理的基础上,坚持良好习惯,让自己的代码健壮一些,这才是正能量啊