mysql联合索引

网上对联合索引众说纷纭 甚至还看到一些不正确的说法 这次我们就对联合索引实验一番 实验联合索引使用情况开始!!!

一、环境

CentOS : Linux 7.4 docker : 10.03.14 mysql:5.6与5.7

二、表建立

引擎:innodb 字符集:utf8-mb4 联合索引:abc

CREATE TABLE `test`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) ,
  `b` int(11) ,
  `c` int(11) ,
  `d` int(11) ,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `abc`(`a`, `b`, `c`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;

三、数据初始化

mysql5.6 与 mysql 5.7 添加50条相同的数据

INSERT INTO `test`.`test`(`a`, `b`, `c`) VALUES (0, 0, 0);
INSERT INTO `test`.`test`(`a`, `b`, `c`) VALUES (0, 0, 1);
INSERT INTO `test`.`test`(`a`, `b`, `c`) VALUES (0, 1, 0);
INSERT INTO `test`.`test`(`a`, `b`, `c`) VALUES (0, 1, 1);
INSERT INTO `test`.`test`(`a`, `b`, `c`) VALUES (1, 0, 0);
INSERT INTO `test`.`test`(`a`, `b`, `c`) VALUES (1, 0, 1);
INSERT INTO `test`.`test`(`a`, `b`, `c`) VALUES (1, 1, 0);
INSERT INTO `test`.`test`(`a`, `b`, `c`) VALUES (1, 1, 1);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (1904, 1987, 6449, 8313);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (3865, 7554, 6353, 7892);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (7216, 7893, 169, 9990);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (127, 9779, 8670, 4161);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (8741, 443, 5729, 8132);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (4728, 180, 1211, 6401);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (275, 2680, 4087, 587);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (1947, 9009, 4803, 2921);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (7655, 1448, 4663, 7201);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (9530, 9692, 1618, 7453);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (3614, 2247, 6781, 1583);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (958, 7086, 3107, 3542);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (6347, 6106, 1241, 1154);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (5192, 976, 2482, 2900);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (7531, 5631, 9854, 9863);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (8104, 7369, 5065, 7238);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (8090, 9144, 1397, 5646);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (8774, 2017, 678, 7047);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (6561, 7918, 6232, 8678);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (1858, 7281, 4752, 3060);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (1476, 9014, 9090, 9655);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (3941, 631, 9218, 1696);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (6871, 6124, 6384, 9332);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (5506, 6523, 663, 6247);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (6683, 7559, 1471, 8354);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (3362, 3197, 5540, 8868);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (8919, 2003, 3644, 1414);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (5605, 2756, 3252, 9957);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (6945, 2846, 251, 1999);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (9587, 82, 905, 4311);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (7096, 503, 5713, 8565);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (2596, 4870, 1300, 7896);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (2892, 1237, 5257, 6045);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (3438, 4154, 5238, 6369);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (6110, 6861, 3039, 8884);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (1348, 5603, 1165, 449);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (9651, 6505, 1433, 7373);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (5873, 9505, 5669, 9854);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (9121, 1441, 1407, 6596);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (5623, 2428, 8643, 6690);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (9843, 3299, 3931, 9252);
INSERT INTO `test`.`test`(`a`, `b`, `c`, `d`) VALUES (502, 7955, 2970, 2974);

四、实验开始

1.例子

2.总情况

一个条件:

where条件 是否用上索引 扫描行数
a = 1 4
b = 1 50
b = 1 50

两个条件:

where条件 是否用上索引 扫描行数
a = 1 and b = 1 2
b = 1 and a = 1 2
a = 1 and c = 1 4
c = 1 and a = 1 4
b = 1 and c = 1 50
c = 1 and b = 1 50

三个条件:

where条件 是否用上索引 扫描行数
a = 1 and b = 1 and c = 1 1
a = 1 and c = 1 and b = 1 1
b = 1 and a = 1 and c = 1 1
b = 1 and c = 1 and a = 1 1
c = 1 and a = 1 and b = 1 1
c = 1 and b = 1 and a = 1 1

五、结论:

  1. 联合索引与where顺序无关
  2. 建立索引(a,b,c) 与建立索引 (a),(a,b),(a,b,c)一样意思 也就是最左匹配原则
  3. where a = 1 and c = 1 仅仅是a条件用上索引 条件c没用上
  4. mysql5.6与5.7情况完全一样

M先生博客
请先登录后发表评论
  • latest comments
  • 总共0条评论