5.where中索引列有运算
3.a=1 and b=1 and c>1 and d=1 这个例子 只有 d 不走索引,如果 索引顺序更改为 abdc 则都会走索引。
create database ITTest; use ITTest; CREATE TABLE tbl_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键', userName varchar(100) not null comment '姓名', userAge int default 0 comment '年龄', userStatus int default 0 comment '用户状态 0 有效,1 无效', userSex int default 0 comment '性别 0 男 1 女', birthDate DATE COMMENT '生日', createTime DATETIME DEFAULT NOW() COMMENT '创建时间', dataChangeLastTime DATETIME DEFAULT NOW() ON UPDATE NOW() COMMENT '最后更新时间' ); alter table tbl_user add index idx_userName(userName); alter table tbl_user add index idx_userSex(userSex); alter table tbl_user add index idx_userStatus(userStatus); alter table tbl_user add INDEX idx_union_userStatus_userSex_birthDate(userStatus,userSex,birthDate ); insert into tbl_user(userName,userAge,userStatus,userSex,birthDate) values ('user001',rand()*100,rand(),rand(),curdate()), ('user002',rand()*100,rand(),rand(),curdate()), ('user003',rand()*100,rand(),rand(),curdate()), ('user004',rand()*100,rand(),rand(),curdate()), ('user005',rand()*100,rand(),rand(),curdate()), ('user006',rand()*100,rand(),rand(),curdate()), ('user007',rand()*100,rand(),rand(),curdate()), ('user008',rand()*100,rand(),rand(),curdate()), ('user009',rand()*100,rand(),rand(),curdate())Explain 查看索引使用情况
Extra: Using where; Using index -- 执行状态说明,这里可以看到的坏的例子是Using temporary和Using
2.如果有一个字段有单独的索引,又符合联合索引的最左匹配原则,索引会怎么选?
select * from user where userSex=0 and userStatus=0 and birthDate>'1897-01-01' select * from user where userSex in(0,1) and userStatus=0 and birthDate>'1897-01-01'分析下上面的两个sql 的执行速度那个快: