欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql如何避免索引失效

程序员文章站 2022-06-02 18:33:25
...
  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