mysql 複合索引(聯合索引) a b c的使用

本博文中所用數據版本爲mysql 5.7.28
通過命令行查看 mysql版本信息如下:

~ mysql --version
mysql Ver 14.14 Distrib 5.7.28, for macos10.14 (x86_64) using EditLine wrapper

緣由:經常面試被問到 符合索引 (a,b,c) 這三個字段組成的符合複合(聯合索引)是否使用的問題。網上答案 通常這樣解釋

複合索引(聯合索引)情況下
a b c 三個字段

在用到 where 條件爲

  • a && b && c 的情況下 會用到聯合索引
  • a && b 的情況下也會用到索引
  • a && c 的情況下不會用到索引
  • b && c 的情況下不會用到索引

上述解釋爲 錯誤的 因此,重新整理博文供大家參考。

實際結果如下:
數據庫版本如上文 mysql 5.7.28
建表語句爲

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `aid` varchar(20) NOT NULL DEFAULT '' COMMENT 'aid',
  `bid` varchar(20) NOT NULL DEFAULT '' COMMENT 'bid',
  `cid` varchar(20) NOT NULL DEFAULT '' COMMENT 'cid',
  PRIMARY KEY (`id`),
  KEY `abc` (`aid`,`bid`,`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

爲測試插入數據

UPDATE `study`.`test` SET `aid` = 'a01', `bid` = 'b01', `cid` = 'c01' WHERE `id` = 1;
UPDATE `study`.`test` SET `aid` = 'a02', `bid` = 'b02', `cid` = 'c02' WHERE `id` = 2;
UPDATE `study`.`test` SET `aid` = 'a03', `bid` = 'b02', `cid` = 'c03' WHERE `id` = 3;

組合結果爲 abc ab ac bc 四種組合結果

  1. abc 組合結果爲
mysql> explain select * from test where aid='a01' and bid='b01' and cid='c01'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
   partitions: NULL
         type: ref
possible_keys: abc
          key: abc
      key_len: 186
          ref: const,const,const
         rows: 1
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

ERROR:
No query specified

可能用到複合索引,實際用到複合索引。

  1. ab 的組合結果如下
mysql> explain select * from test where aid='a01' and bid='b01' \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
   partitions: NULL
         type: ref
possible_keys: abc
          key: abc
      key_len: 124
          ref: const,const
         rows: 1
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

ERROR:
No query specified

可能用到複合索引,實際用到複合索引。

  1. ac 的組合情況下
explain select * from test where aid='a01'  and cid='c01'\G;
*************************** 1. row ***************************
          id: 1
 select_type: SIMPLE
       table: test
  partitions: NULL
        type: ref
possible_keys: abc
         key: abc
     key_len: 62
         ref: const
        rows: 1
    filtered: 33.33
       Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)

ERROR:
No query specified

可能用到複合索引,實際用到複合索引。

  1. bc 的組合情況下
explain select * from test where bid='b01' and cid='c01'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test
   partitions: NULL
         type: index
possible_keys: NULL
          key: abc
      key_len: 186
          ref: NULL
         rows: 3
     filtered: 33.33
        Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)

ERROR:
No query specified

可能用到的索引 :無 ,實際用到複合索引。

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