联合索引的数据结构
每个节点的索引是按序排列的。 符合最左原则。
实践:
创建表和数据:
CREATE TABLE employees
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
varchar(24) NOT NULL DEFAULT ‘’ COMMENT ‘姓名’,
age
int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘年龄’,
position
varchar(20) NOT NULL DEFAULT ‘’ COMMENT ‘职位’,
hire_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘入职时间’,
PRIMARY KEY (id
),
KEY idx_name_age_position
(name
,age
,position
) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT=‘员工记录表’;
INSERT INTO employees(name,age,position,hire_time) VALUES(‘LiLei’,22,‘manager’,NOW());
INSERT INTO employees(name,age,position,hire_time) VALUES(‘HanMeimei’, 23,‘dev’,NOW());
INSERT INTO employees(name,age,position,hire_time) VALUES(‘Lucy’,23,‘dev’,NOW());
-
由表创建语句可见,联合索引 idx_name_age_position 中的索引顺序为: name ,age ,position
那么 -
SELECT name,age FROM employees WHERE age = 23 AND position =‘manager’ AND name= ‘LiLei’
查询语句中where 后面的顺序和索引的顺序不一致,会使索引生效吗? 会的,SQL 优化器会自动优化的 -
SELECT name,age FROM employees WHERE name= ‘LiLei’ AND age > 23 AND position =‘manager’;
该语句使用到的索引 只有 name 和 age ,position没有使用到索引,因为 age 使用了 > 范围查找,使得范围查找到的所有索引行,要和position =‘manager’ 轮循匹配。。