mysql如何避免索引失效

  1. 全值匹配:对索引中所有的列都指定具体值

  2. 最左前缀法则:查询从索引的最左前列开始,并且不跳过索引中的列.
    - 是指查询条件包含了哪些索引,跟查询条件的列的位置没有关系.
    - 假如有ABC三个字段创建了组合索引,查询条件只有A和C,会有A的索引,不会走C的索引.

  3. 范围查询右边的列不能使用索引

--address索引失效了.其中name,status,address是符合索引
select * from tb_seller where name='小明' and status >'1' and address='bj'
  1. 不要再某一列上进行运算,否则索引失效
-- 从name字段的第3位开始,截取两个字符.对name进行了运算
select * from tb_seller where substring(name,3,2) = '科技'
  1. 字符串不写单引号会造成索引失效.
    • 当mysql的优化器检测到字段为varchar时,会进行隐式类型转换.进行了运算操作,索引失效.
  2. 尽量使用覆盖索引,避免select *
    • 查询的列都是索引的列,因为索引中会有列的值,这个时候就不用进行回表查询.
    • 如果使用select * 有些列不在索引中,那么就需要进行回表查查询
    • explain的extra可以查询是否使用到了覆盖索引
      * using index:使用覆盖索引之后就会出现
      * using where:在查找使用索引的情况,需要回表去查询所需的数据
      * using index condition:查找使用了索引,但是需要回表查询数据
      * using index : using where: 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据.
  3. or之后的字段不是索引字段,会造成or之前的字段索引失效,整个索引将失效.并且or也是不走复合索引的.(假如有AB两个个字段组成的符合索引,where A=XXX or B=XXX)
  4. 以%开头的Like模糊查询会造成索引失效:通过覆盖索引来解决这个问题
    • 并不是说liKe会造成索引失效,是以%开头的like
    • 覆盖索引可以进行以%开头的like不会造成索
  5. mysql评估使用索引比全表扫描要面,那么mysql就会走全表扫描
  6. is null,is not null有时走索引有时不走索引
    • 当全表扫描比使用索引快的时候,不走索引.
  7. in 走索引,not in不走索引
  8. 尽量使用复合索引,少使用单列索引
  9. 复合索引相当于创建了多个索引,假设有ABC三个字段,创建ABC复合索引,相当于创建了A索引,AB索引,ABC索引。
  10. 单列索引,数据库会选择一个最优(辨识度最高的)的索引,而不会选择所有的索引.比如ABC有三个字段,创他们的单列索引,查询条件后面是ABC,数据库只会选择一个最优索引.

你可能感兴趣的:(mysql,mysql)