• Mysql 三种不使用索引的情况


    目录

    1. 查询语句中使用LIKE关键字

    例 1

    2. 查询语句中使用多列索引

    例 2

    3. 查询语句中使用OR关键字

    例 3

    总结


    索引可以提高查询的速度,但并不是使用带有索引的字段查询时,索引都会起作用。使用索引有几种特殊情况,在这些情况下,有可能使用带有索引的字段查询时,索引并没有起作用,下面重点介绍这几种特殊情况。

    1. 查询语句中使用LIKE关键字

    在查询语句中使用 LIKE 关键字进行查询时,如果匹配字符串的第一个字符为“%”,索引不会被使用。如果“%”不是在第一个位置,索引就会被使用。

    例 1

    为了便于理解,我们先查询 tb_student 表中的数据,SQL 语句和运行结果如下:

    mysql> SELECT * FROM tb_student;
    +----+------+------+------+
    | id | name | age  | sex  |
    +----+------+------+------+
    |  1 | 张三 |   12 | 男   |
    |  2 | 李四 |   12 | 男   |
    |  3 | 王五 |   13 | 女   |
    |  4 | 张四 |   13 | 女   |
    |  5 | 王四 |   15 | 男   |
    |  6 | 赵六 |   12 | 女   |
    +----+------+------+------+
    6 rows in set (0.03 sec)

    下面在查询语句中使用 LIKE 关键字,且匹配的字符串中含有“%”符号,使用 EXPLAIN 分析查询情况,SQL 语句和运行结果如下:

    mysql>  EXPLAIN SELECT * FROM tb_student WHERE name LIKE '%四'\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb_student
       partitions: NULL
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 6
         filtered: 16.67
            Extra: Using where
    1 row in set, 1 warning (0.01 sec)
    
    mysql> CREATE INDEX index_name ON tb_student(name);
    Query OK, 6 rows affected (0.13 sec)
    
    mysql>  EXPLAIN SELECT * FROM tb_student WHERE name LIKE '李%'\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb_student
       partitions: NULL
             type: range
    possible_keys: index_name
              key: index_name
          key_len: 77
              ref: NULL
             rows: 1
         filtered: 100.00
            Extra: Using index condition
    1 row in set, 1 warning (0.00 sec)

    第一个查询语句执行后,rows 参数的值为 6,表示这次查询过程中查询了 6 条记录;第二个查询语句执行后,rows 参数的值为 1,表示这次查询过程只查询 1 条记录。同样是使用 name 字段进行查询,因为第一个查询语句的 LIKE 关键字后的字符串是以“%”开头的,所以第一个查询语句没有使用索引,而第二个查询语句使用了索引 index_name。

    2. 查询语句中使用多列索引

    多列索引是在表的多个字段上创建一个索引,只有查询条件中使用了这些字段中的第一个字段,索引才会被使用。

    例 2

    在 name 和 age 两个字段上创建多列索引,并验证多列索引的使用情况,SQL 语句和运行结果如下:

    mysql> CREATE INDEX index_name_age ON tb_student(name,age);
    Query OK, 6 rows affected (0.11 sec)
    
    mysql> EXPLAIN SELECT * FROM tb_student WHERE name LIKE '李%'\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb_student
       partitions: NULL
             type: range
    possible_keys: index_name_age
              key: index_name_age
          key_len: 77
              ref: NULL
             rows: 1
         filtered: 100.00
            Extra: Using index condition
    1 row in set, 1 warning (0.05 sec)
    
    mysql> EXPLAIN SELECT * FROM tb_student WHERE age LIKE '12'\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb_student
       partitions: NULL
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 6
         filtered: 16.67
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)

    第一条查询语句的查询条件使用了 name 字段,分析结果显示 rows 参数的值为 1,且查询过程中使用了 index_name_age 索引。第二条查询语句的查询条件使用了 age 字段,结果显示 rows 参数的值为 6,且 key 参数的值为 NULL,这说明第二个查询语句没有使用索引。

    因为 name 字段是多列索引的第一个字段,所以只有查询条件中使用了 name 字段才会使 index_name_age 索引起作用。

    3. 查询语句中使用OR关键字

    查询语句只有 OR 关键字时,如果 OR 前后的两个条件的列都是索引,那么查询中将使用索引。如果 OR 前后有一个条件的列不是索引,那么查询中将不使用索引。

    例 3

    下面演示 OR 关键字的使用。

    mysql> EXPLAIN SELECT * FROM tb_student WHERE name='张三' or sex='男'\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb_student
       partitions: NULL
             type: ALL
    possible_keys: index_name,index_name_age
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 6
         filtered: 30.56
            Extra: Using where
    1 row in set, 1 warning (0.06 sec)
    mysql> EXPLAIN SELECT * FROM tb_student WHERE name='张三' or id='12'\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb_student
       partitions: NULL
             type: index_merge
    possible_keys: PRIMARY,index_name,index_name_age
              key: index_name,PRIMARY
          key_len: 77,4
              ref: NULL
             rows: 2
         filtered: 100.00
            Extra: Using union(index_name,PRIMARY); Using where
    1 row in set, 1 warning (0.01 sec)

    由于 sex 字段没有索引,所以第一条查询语句没有使用索引;name 字段和 id 字段都有索引,所以第二条查询语句使用了 index_name 和 PRIMARY 索引 。

    总结

    使用索引查询记录时,一定要注意索引的使用情况。例如,LIKE 关键字配置的字符串不能以“%”开头;使用多列索引时,查询条件必须要使用这个索引的第一个字段;使用 OR 关键字时,OR 关键字连接的所有条件都必须使用索引。

  • 相关阅读:
    零样本和少样本学习
    find /root -type f -mtime +30 -exec rm {} ;的含义
    戟星安全实验室|五分钟教你挖掘小程序漏洞
    Autobus 方法记录
    Linux初始化mysql后外网无限制访问
    HDLBits: 在线学习 SystemVerilog(四)-Problem 15-18
    Colossal-AI
    【AGC】SDK未经用户同意获取AndroidID问题
    【中秋征文】使用Python中秋节程序员的浪漫《嫦娥奔月》
    git创建新分支将项目挂载到新分支操作
  • 原文地址:https://blog.csdn.net/CHENSMALLYUN/article/details/134417535