索引常见问题
问题1
默认是在InnoDB存储引擎。
- 首先,最基本的,userid要加索引(因为一般用过滤条件加索引),此时创建的是二级索引树;
- select *还要涉及回表。 而且还有order by addtime,如果addtime没有建索引的话,explain分析时会出现using filesort(涉及addtime的文件排序)!
所以,我们要加联合索引(多列索引):userid+addtime
这样的话,选出来的addtime在二级索引树上就已经是有序的了
有using filesort的差别,数据的外排序。用userid=123选择出来的数据越多,耗费的排序性能差的越大。
主键索引:
区分度高的字段:
例如,看下图,sex创建索引了,但是没有用到,这是MySQL server的一个优化,过滤出来的数据量已经占了整表的大部分,就没有必要用索引了。
可以看到,并没有用到索引,还是全表搜索的:
问题2
- 一张表的一次查询只能用到1个索引,它看用a=1过滤的数据少还是b=2过滤的少;
- 用拿个索引搜出来的数据少的话,就用哪个索引。