MySQL——索引失效的10种情况

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询速度,因此索引对查询的速度有着至关重要的影响。

  • 使用索引可以快速定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能
  • 如果查询时没有使用索引,查询语句就会扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。

大多数情况下都(默认)采用B+树来构建索引。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引

其实,用不用索引,最终都是优化器说了算。优化器时基于什么的优化器?基于cost开销(CostBaseOptimizer),它不是基于规则(Rule-BasedOptimizer),也不是基于语义,怎么样开销小就怎么来。另外,SQL语句是否使用索引,跟数据库版本、数据量、数据选择度都有关系。

1、要尽量满足全值匹配
2、最佳左前缀法则

MySQL可以为多个字段创建索引,一个索引可以包含16个字段。对于多列索引,**过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。**如果查询条件中没有使用这些字段中的第1个字段时,多列(或联合)索引不会被使用。

索引文件具有B-Tree的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引【Alibaba《开发手册》】

3、主键插入顺序尽量自增
4、计算、函数、类型转换(自动或手动)
  • 计算

    EXPLAIN SELECT * FROM `s1` WHERE id = id + 1
    

    在这里插入图片描述

  • 函数

    EXPLAIN SELECT min(key2) FROM `s1` where key2 = 10036
    
  • 类型转换

    此时key1是varchar类型

    EXPLAIN SELECT * FROM `s1` where key1 = 1
    

    在这里插入图片描述

5、范围条件右边的列表

应用开发中范围查询,例如:金额查询,日期查询往往都是范围查询。应该查询条件放置where语句最后。(创建联合索引中,务必把范围涉及到的字段写在最后)

EXPLAIN SELECT * FROM `s1` WHERE key1 = 'vLuQVg' and key3 = 'RQFCYj' and key2 >10036

在这里插入图片描述

联合索引失效,注意顺序不是SQL,而是设计索引的顺序

6、不等于(!=或者<>)
EXPLAIN SELECT * FROM `s1` WHERE key1 != 'vLuQVg'

在这里插入图片描述

7、is not null
EXPLAIN SELECT * FROM `s1` WHERE id is not null

在这里插入图片描述

8、like以通配符%开头
EXPLAIN SELECT * FROM `s1` WHERE key1 like '%v'

在这里插入图片描述


页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。【Alibaba 《Java开发手册》】

9、OR前后存在非索引的列

在WHERE子句中,如果在ON前的条件列进行了索引,而在OR后的条件列没有进行索引,那么索引也会失效。也就是说,OR前后两个条件中的列都是索引时,查询中才使用索引

因为OR的含义就是两个只要满足一个即可,因此只有一个条件列进行了索引时没有意义的,只要有条件的列没有进行索引,就会进行全表扫描,因此索引的条件列也会失效

EXPLAIN SELECT * FROM `s1` where key1 = 'vLuQVg' OR common_field ='ExCtlZpyzZ'

在这里插入图片描述

10、数据库和表的字符统一
建议
  • 对于单列索引,尽量选择针对当前query过滤性更好的索引。
  • 在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。
  • 在选择组合索引的时候,尽量选择能够包含当前query中的where子句中更多字段的索引。
  • 在选择组合索引的时候,如果某个字段可能出现范围查询时,尽量把这个字段放在索引次序的最后面。

相关推荐

  1. 索引失效 12 情况

    2024-06-05 19:37:18       55 阅读
  2. MYSQL索引失效情况

    2024-06-05 19:37:18       47 阅读
  3. MySQL数据库索引失效常见情况

    2024-06-05 19:37:18       44 阅读
  4. 【示例】MySQL-索引失效情况

    2024-06-05 19:37:18       38 阅读
  5. 索引失效情况

    2024-06-05 19:37:18       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 19:37:18       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 19:37:18       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 19:37:18       82 阅读
  4. Python语言-面向对象

    2024-06-05 19:37:18       91 阅读

热门阅读

  1. [力扣题解] 151. 反转字符串中的单词

    2024-06-05 19:37:18       28 阅读
  2. Python笔记 - *args和**kwargs

    2024-06-05 19:37:18       32 阅读
  3. linux笔记

    2024-06-05 19:37:18       31 阅读
  4. 【C语言从入门到入土】第一章前言

    2024-06-05 19:37:18       29 阅读
  5. 洛谷 P8741 [蓝桥杯 2021 省 B] 填空问题 题解

    2024-06-05 19:37:18       33 阅读
  6. 2024华为OD机试真题-机场航班调度-C++(C卷D卷)

    2024-06-05 19:37:18       27 阅读
  7. 【学习笔记】TypeScript

    2024-06-05 19:37:18       23 阅读
  8. 力扣283题:移动零(快慢指针)

    2024-06-05 19:37:18       35 阅读
  9. for循环

    2024-06-05 19:37:18       31 阅读