索引的优势:提高查询效率,降低数据库IO,通过对索引列进行排序,可以降低CPU的消耗
索引的劣势:增加磁盘存储(mysql要存索引文件),降低更新 表的效率
MyISAM和Innodb存储引擎只支持BTREE索引类型
索引分类
单列索引
组合索引
全文索引
空间索引
Innodb下数据和索引是在同一个索引树上的,叶子节点存放的是数据,而MyISAM的B树叶子节点存放的是数据的地址
如果使用的是辅助索引,则查询索引树的次数为2,先从辅助索引树查出主键,再从主键索引树查出数据,如果将辅助索引与主键结合形成组合索引,则查询的索引树次数则为1,提高查询效率
Explian参数讲解
1、Id越大,优先级别越高,越先执行,如果相等,按顺序执行
2、Type依次从好到坏排序: System, const, eq_ref, ref, fulltext, …range,inde,all
组合索引,如果遇到范围查询时,所以会失效:
如:index_A_B_C_D
查询条件为: where A =1 and B =1 and C=1 and D=1, 索引都用到了
而当条件为:where A = 1 and B = 1 and C >1 and D =1 索引值用到了A,B,C
如果将索引改成 index_A_B_D_C则索引全部生效
索引失效的原因分析
1、不要在索引上做计算
2、索引字段上不要使用!= 或者<> 或者is not null,会导致索引失效而转全表扫描
3、索引字段不要使用like通配符开头
4、索引字段如果是字符串,要加单引号,防止索引失效,(隐式转换导致)
5、非主键索引字段不要使用or