MySql索引失效(版本8.0.18)

一、MySql的索引

1、索引失效問題

(1)總結

MySql在版本8.0.18中,導致索引失效的原因有

  • 模糊查詢時,前模糊導致索引失效

  • 對列使用函數操作,導致索引失效

  • 使用<>、!=導致索引失效

  • 當字段是字符串類型,傳入數字類型導致索引失效

  • 複合索引時,條件1失效或者是不存在,導致索引失效

MySql在版本5.6中,導致索引失效的原因額外增加了幾種

  • 使用 IN 導致索引失效

  • 使用 OR 導致索引失效

(2)普通索引

  1. 新建一張測試表
    CREATE TABLE `Test` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `column1` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `column2` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
      `column3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `column4` varchar(10000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `column5` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `varcharKey` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `bigintKey` bigint(20) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_varcharKey` (`varcharKey`) USING BTREE,
      KEY `idx_bigintKey` (`bigintKey`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

     

  2. 使用or查詢並未導致索引失效?
    #使用or查詢並未導致索引失效?
    EXPLAIN
    SELECT * FROM Test WHERE varcharKey = '2019-12-21' or varcharKey = '2019-12-22';

  3. 使用模糊前綴,索引失效

    #使用模糊前綴,索引失效
    EXPLAIN
    SELECT * FROM Test WHERE varcharKey like '%2019-12-21';

  4. 使用函數操作列,索引失效

    #使用函數操作,索引失效
    EXPLAIN
    SELECT * FROM Test WHERE bigintKey + 1 = 64967499;

  5. 使用<>、!=操作,索引失效

    #使用<>、!=操作,索引失效
    EXPLAIN
    SELECT *     FROM Test WHERE bigintKey <> 64967499;
    EXPLAIN
    SELECT *     FROM Test WHERE bigintKey != 64967499;

  6. 當數據庫字段是字符類型,傳入數字,索引失效
    當數據庫字段是數字,傳入字符,索引未失效

    #當數據庫字段是字符類型,傳入數字,索引失效
    #當數據庫字段是數字,傳入字符,索引未失效
    EXPLAIN
    SELECT *     FROM Test WHERE varcharKey = 64967499;
    EXPLAIN
    SELECT *     FROM Test WHERE bigintKey = '64967499';

(3)複合索引

  1. 新建一張測試表
    CREATE TABLE `Test2` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `column1` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
      `column2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `column3` varchar(10000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `column4` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `varcharKey` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `varcharKey2` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
      `bigintKey` bigint(20) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_varcharKey1_varcharKey2_bigintKey` (`varcharKey`,`varcharKey2`,`bigintKey`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=233168 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

     

  2. 缺少條件1不會走索引
    #缺少條件1不會走索引
    EXPLAIN
    SELECT *     FROM Test2 WHERE varcharKey = '64967499';
    EXPLAIN
    SELECT *     FROM Test2 WHERE varcharKey2 = '64967499';
    EXPLAIN
    SELECT *     FROM Test2 WHERE bigintKey = 64967499;

  3. 條件1索引失效,不會走索引
    #條件1索引失效,不會走索引
    EXPLAIN
    SELECT * 	FROM Test2 WHERE varcharKey <> '64967499' and varcharKey2 = '64967499' and bigintKey = 64967499;
    EXPLAIN
    SELECT * 	FROM Test2 WHERE varcharKey = '64967499' and varcharKey2 <> '64967499' and bigintKey = 64967499;
    EXPLAIN
    SELECT * 	FROM Test2 WHERE varcharKey = '64967499' and varcharKey2 = '64967499' and bigintKey <> 64967499;

二、 Mysql版本5.6

1、索引失效

(1)使用 OR 導致索引失效

EXPLAIN
SELECT * FROM Test WHERE varcharKey = '2019-12-21' or varcharKey = '2019-12-22';

(2)使用 IN 導致索引失效

EXPLAIN
SELECT * FROM test WHERE bigintKey IN (1,4);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章