联合索引最长匹配规则
最左匹配原则
只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
-- 创建测试表 CREATE TABLE `student_0506` ( `id` int(11) NOT NULL, `name` varchar(10) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `idx_name_age` (`name`,`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 -- 插入测试数据 DROP PROCEDURE pro_0506; CREATE PROCEDURE pro_0506() BEGIN DECLARE i INT; DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT ''; DECLARE age INT; SET i = 1; WHILE i <= 10000 do SET return_str = substring(char_str, FLOOR(1 + RAND()*62), 8); SET i = i+1; SET age = FLOOR(RAND() * 100); INSERT INTO student_0506(id, name, age) values(i, return_str, age); END WHILE; END; CALL pro_0506();
表 student_0506 在列 name 和 Age 上建立了联合索引,name列为最左所在列,使用存储过程插入了10000条数据
查询1 (遵循了最左匹配规则):
查询2(遵循了最左匹配规则):
查询3(违背了最左匹配规则):
修改 表联合索引最左列为 age
alter table student_0506 drop index idx_name_age;
alter table student_0506 add index idx_age_name(age,name);
再执行查询: