where order by

order by 上的索引不太有用,因为只是排序, 没有筛选,而且复合索引只能用于筛选,不能用于排序?如果复合索引AB,是where A=? orderby B,那么是可以的,因为在A的下面B本身就是有序的,但是如果是where A = ? or A = ? orderby B,那么就不行了,因为在两个A的值之后,B就是无序的了。但是这个时候走的还是复合索引,只不过是稍慢了点,必须把A的两个值对应的数据全取到内存,在内存中排序,而之前A只有一个值的时候,取出来基本有序了?。但是如果上面的语句加上limit而且此时B上有个单独的索引的话,会更慢,因为这时候mysql会走B这个单独索引,那就是全表扫描了。

比如 age 和 id 都有索引, where age 有一个范围 orderby id,如果age范围过大,那么用的索引直接就是id了,如果age范围小到一定程度,走的索引是age,这中间mysql似乎有一个算法,但是有断层,会有一个突然的效率提高,尽量的减小age的范围,使得mysql走age这个索引,检索出来的 在内存中再排序,也是很快的,如果走id,那么就相当于全表扫描了,会很慢。这时候可以不用orderby,看看自己取到本机上再排序会不会快一点?网络io会占用很多,增加了本机的负担。但是减少了msyql的负担,毕竟全表扫描太耗费磁盘和内存。

复合索引尽量用来缩小范围,orderby尽量让mysql在内存中排,如果mysql 的

猜你喜欢

转载自www.cnblogs.com/chuliang/p/9572669.html