MySql索引优化

  1. 显示索引:
    show index from article;
     
  2. 创建索引:
    create index ids_article_ccv on article(category_id,comments,views);
    或者使用另一种方式:
    alter table article add index ids_article_ccv (category_id,comments,views);
     
  3. 删除索引:

    drop index ids_article_ccv from article;

     

索引失效案例:
 

  1. 全值匹配我最爱:

    索引  idx_staffs_nameAgePos 建立索引时 以 name , age ,pos 的顺序建立的。全值匹配表示 按顺序匹配的
    EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';
    EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25;
    EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev';


     
  2. 最佳左前缀法则:  如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

    and 忽略左右关系。既即使没有没有按顺序 由于优化器的存在,会自动优化。
    经过试验结论  建立了 idx_nameAge 索引  id 为主键
        1.当使用覆盖索引的方式时,(select name/age/id from staffs where age=10 (后面没有其他没有索引的字段条件)),即使不是以 name 开头,也会使用 idx_nameAge 索引。
        既 select 后的字段 有索引,where 后的字段也有索引,则无关执行顺序。
        2.除开上述条件 才满足最左前缀法则。
     
    EXPLAIN SELECT * FROM staffs WHERE age = 25 AND pos = 'dev';
     
    EXPLAIN SELECT * FROM staffs WHERE pos = 'dev';


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


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

    范围 若有索引则能使用到索引,范围条件右边的索引会失效(范围条件右边与范围条件使用的同一个组合索引,右边的才会失效。若是不同索引则不会失效)
  5. 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *

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

    索引  idx_nameAgeJob
             idx_name
    使用 != 和 <> 的字段索引失效( != 针对数值类型。 <> 针对字符类型
    前提 where and 后的字段在混合索引中的位置比比当前字段靠后  where age != 10 and name='xxx'  ,这种情况下,mysql自动优化,将 name='xxx' 放在 age !=10 之前,name 依然能使用索引。只是 age 的索引失效)


     
  7. is not null 也无法使用索引,但是is null是可以使用索引的

     
  8. like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作
     like ‘%abc%’  type 类型会变成 all
    like ‘abc%’ type 类型为 range ,算是范围,可以使用索引


     
  9. 字符串不加单引号索引失效
     
  10. 少用or,用它来连接时会索引失效

     
  11. 总结:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值