mysql索引 ><_mysql索引

为什么使用索引

项目中我们经常要使用索引,因为很多场景都要求有比较好的查询性能。

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   ——   会不使用索引

索引失效与优化

例如建议索引如下:

b00c6a573c5b1d2d1f9d0ed7c798f703.png

1、全值匹配我最爱

fe93b7c5ffd047bb5b88a5306f8cdf9d.png

2、最佳左前缀法则(带头索引不能死,中间索引不能断)

如果索引了多个列,要遵守最佳左前缀法则。指的是查询从索引的最左前列开始 并且 不跳过索引中的列。 正确的示例参考上图。

错误的示例: 带头索引死:

35d9663e3c3e1e7e800b2f4cf17f4d42.png

中间索引断(带头索引生效,其他索引失效):

cf5b77df28111494f47db352de53a487.png

3、不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描

b29c7b05d09bd766bb72c2f99cce9655.png

4、mysql存储引擎不能继续使用索引中范围条件(bettween、、in)

9dc4fa5647558d14aa50ab2e57941c1c.png

5、尽量使用覆盖索引(只查询索引的列(索引列和查询列一致)),减少select *等)右边的列

5acb1d9083506a537d749f7760fe00aa.png

6、索引字段上使用(!=或者 < >)判断时,会导致索引失效而转向全表扫描

c63c8d39485e8d1eb0ed29072836660c.png

7、索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描

33fb1d47d7dd1c565631cce8eb4276ec.png

8、索引字段使用like以通配符开头(‘%字符串’)时,会导致索引失效而转向全表扫描

992c3d74d58b969483a5aaf079e3ecdb.png

由结果可知,like以通配符结束相当于范围查找,索引不会失效。与范围条件(bettween、、in等)不同的 是:不会导致右边的索引失效。

问题:解决like ‘%字符串%’时,索引失效问题的方法? 使用覆盖索引可以解决。

6f71ca493e199796af63bd0d48e1b138.png

9、索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描

3fc51fbd9b27cbd4b16ff1b0e54a2da2.png

10、索引字段使用 or 时,会导致索引失效而转向全表扫描

fffc30cab1ae68eeffb0e875bfcec516.png

d0ef0e089ec6a373a52e10d30b14ae50.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值