MySQL学习笔记:组合索引-最左原则
新建表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`uname` varchar(100) NOT NULL DEFAULT '' COMMENT '姓名',
`nickname` varchar(255) NOT NULL DEFAULT '' COMMENT '昵称',
`phone` char(11) NOT NULL DEFAULT '' COMMENT '电话',
`emp_no` varchar(20) NOT NULL DEFAULT '' COMMENT '员工编号',
`dept_id` int(4) NOT NULL DEFAULT '0' COMMENT '部门id',
`pwd` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',
`avt` varchar(255) NOT NULL DEFAULT '' COMMENT '头像',
`addr` varchar(255) NOT NULL DEFAULT '' COMMENT '地址',
PRIMARY KEY (`id`),
KEY `index_user` (`dept_id`,`uname`,`phone`) USING BTREE,
KEY `avt` (`avt`),
KEY `emp_no` (`emp_no`),
KEY `index_nickname` (`nickname`,`pwd`) USING BTREE,
KEY `addr` (`addr`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
最左原则
- where子句中字段的顺序不会影响索引的使用
SELECT * FROM `user` WHERE uname = '5f686bb79ff03' AND dept_id = 91 AND phone = '14097548200';
- where子句中,只能按照索引字段,从右向左依次截取字段,剩下的字段依次作为有效索引
可以直接用的有效索引有:(KEY `index_user` (`dept_id`,`uname`,`phone`) USING BTREE
dept_id
,uname
,phone
),(dept_id
,uname
),(dept_id
)
(dept_id
,phone
)中phone
是走不上索引的,但是当满足MySQL的索引下推条件时,是可以减少回表次数,从而减少查询时间的。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: