闽公网安备 35020302035485号
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 的执行速度那个快: