• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

mysql复合索引(联合索引)abc的使用 

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本博文中所用数据版本为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 的情况下不会用到索引

 含a的都可以用到索引,优化器自动调整顺序,不含a的用不到索引。

实际结果如下:
数据库版本如上文 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

结论:
复合索引(abc) 所有情况的罗列, 最根本的还是最左原则
abc 能用到索引
bca 能用到索引
cab 能用到索引
ab 能用到索引
ac 能用到索引
ba 能用到索引
ca 能用到索引
bc 用不到索引
b 用不到索引
c 用不到索引
cb 用不到索引
————————————————
 
原文链接:https://blog.csdn.net/liuqun0319/article/details/103730224

本博文中所用数据版本为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 的情况下不会用到索引

 含a的都可以用到索引,优化器自动调整顺序,不含a的用不到索引。

实际结果如下:
数据库版本如上文 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

结论:
复合索引(abc) 所有情况的罗列, 最根本的还是最左原则
abc 能用到索引
bca 能用到索引
cab 能用到索引
ab 能用到索引
ac 能用到索引
ba 能用到索引
ca 能用到索引
bc 用不到索引
b 用不到索引
c 用不到索引
cb 用不到索引
————————————————
 
原文链接:https://blog.csdn.net/liuqun0319/article/details/103730224


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#反射通过类名创建类实例发布时间:2022-07-14
下一篇:
用vs2005给c++生成的exe加个图标发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap