为什么使用索引
项目中我们经常要使用索引,因为很多场景都要求有比较好的查询性能。
l 优势
* 类似于书的目录,可以提高数据检索的效率,降低数据库的IO成本。
* 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
* 被索引的列会自动进行排序,包括单列索引和组合索引,只是组合索引的排序要复杂一些。
* 如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多。
l 劣势
* 索引会占据磁盘空间
* 索引会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。
使用
ALTER TABLE xxx_table ADD INDEX 自定义索引名字('列1','列2','列3')
我们一般会建立组合索引,索引字段从左到右是有顺序的。
当我们执行查询语句时,WHERE条件从左到右要和索引的顺序匹配(如果顺序不匹配,MYSQL语法优化器会帮我们调整顺序)
1. WHERE条件中如果包含索引的最左边一个列名(如这里的'列1')条件,则可以极大程度地提高查询性能
2. WHERE条件中如果只包含索引的非最左边一个列名(如这里的'列2','列3'),则需要遍历整个自定义索引数
3. WHERE条件中如果不包含索引列名,则无法使用索引
索引使用建议
1.最好用数字做索引,主键最好是自增id而非uuid
2.每次查询只能用一个索引,因此建议使用组合索引
3.查询的字段如果辅助索引树都包含,可以省去第二次搜索主键索引树的操作
哪些情况需要创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 多表关联查询中,关联字段应该创建索引
- 查询中排序的字段,应该创建索引
- 查询中统计或者分组字段,应该创建索引
哪些情况不需要创建索引
- 表记录太少
- 经常进行增删改操作的表
- 频繁更新的字段
- where条件里使用频率不高的字段
注意事项
like语句 —— like '%aaa%'或者like '%aaa'不会使用索引而like "aaa%"可以使用索引
is null、is not null —— 会不使用索引
索引失效与优化
例如建议索引如下:
1、全值匹配我最爱
2、最佳左前缀法则(带头索引不能死,中间索引不能断)
如果索引了多个列,要遵守最佳左前缀法则。指的是查询从索引的最左前列开始 并且 不跳过索引中的列。 正确的示例参考上图。
错误的示例: 带头索引死:
中间索引断(带头索引生效,其他索引失效):
3、不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描
4、mysql存储引擎不能继续使用索引中范围条件(bettween、<、>、in)
5、尽量使用覆盖索引(只查询索引的列(索引列和查询列一致)),减少select *等)右边的列
6、索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描
7、索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描
8、索引字段使用like以通配符开头(‘%字符串’)时,会导致索引失效而转向全表扫描
由结果可知,like以通配符结束相当于范围查找,索引不会失效。与范围条件(bettween、<、>、in等)不同的 是:不会导致右边的索引失效。
问题:解决like ‘%字符串%’时,索引失效问题的方法? 使用覆盖索引可以解决。
9、索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描
10、索引字段使用 or 时,会导致索引失效而转向全表扫描