美文网首页
MySQL 索引优化

MySQL 索引优化

作者: 洛美萨斯 | 来源:发表于2020-06-17 12:43 被阅读0次

1.索引分析

单表索引

where后面的查询字段card已经添加了索引idx_class_card

image-20200511032558409

两表索引

left join 左表全都有,右表关联字段添加索引

right join 右表全都要有,左表关联字段添加索引

image-20200511033130132

三表索引

索引要设置在经常查询的字段上

image-20200511034256489

2.索引失效

test03表作为测试表

image-20200511035520836
  1. 全值匹配我最爱

    where后面的查询字段与复合索引一一匹配上,c1,c2,c3,c4和复合索引idx_test03_c1234

    image-20200511035725036
  2. 最佳左前缀法则

    复合索引的第一个字段一定不能丢失,否则索引失效

    c1是复合索引第一个字段,没有它,type从ref变为ALL,idx_test03_c1234索引失效

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

    where后面的索引列c1使用了left函数后,idx_test03_c1234索引失效,type从ref变为ALL

    image-20200511040936570
  4. 存储引擎不能使用索引中范围条件右边的列

    where后面c2>'a2'使用了>,type从ref变为range,从key_len可以看出只有c1,c2有效,c3无效,范围之后索引无效

    image-20200511041256367
  5. 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*

    select * 的Extra为NULL,而使用具体字段名的Extra则为Using index,使用了覆盖索引(Covering Index)

    覆盖索引是select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。

    image-20200511041736322
  6. mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描

    where后面查询字段c2使用了!=或者<>,type从ref变为ALL,key变为NULL,索引失效

    image-20200511042345614
  7. is null,is not null 也无法使用索引

  1. like以通配符开头('$abc...')mysql索引失效会变成全表扫描操作

    where后面的c1使用%1%,type从ref变成ALL,

    c2使用%2%,只有c1索引有效,c2及之后的索引统统失效

    如果把%放后面,索引有效,type从ref变成range

    image-20200511043216418
  2. 字符串不加单引号索引失效

    where之后c1='1',使用varchar类型,使用了索引

    c1=1,mysql优化器会自动根据字段类型(varchar)转为'1',然后进行查找,自动转换使索引失效

    image-20200511043704818
  3. 少用or,用它连接时会索引失效

    where后面c1='a1' or c2='a2',查询条件使用or连接,type从ref变成ALL,key变为NULL,索引失效

    image-20200511044003254

3.总结

全值匹配我最爱,最左前缀要遵守;

带头大哥不能死,中间兄弟不能断;

索引列上少计算,范围之后全失效;

LIKE百分写最右,覆盖索引不写星;

不等空值还有or,索引失效要少用;

VAR引号不可丢,SQL高级也不难.

相关文章

网友评论

      本文标题:MySQL 索引优化

      本文链接:https://www.haomeiwen.com/subject/duquxktx.html