一、
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=1100001 DEFAULT CHARSET=utf8 COMMENT='员工记录表';
1.全值匹配
2.最左前缀法则
如果存在索引多列,要遵守最左前缀法则。
3.不在索引列上做任何操作计算,会导致索引失效转向全表扫描。
添加一个索引:
ALTER TABLE `employees` ADD INDEX `idx_hire_time` ( `hire_time` ) USING BTREE;
转为范围查找会走索引:
4.存储引擎不能使用索引中范围条件右边的列
5.尽量使用覆盖索引,减少select *
6.使用不等于会导致全表扫描。
7.isnull,isnotnull也无法使用索引
8.like以通配符开头会导致全表扫描。
解决like'%字符串%'索引不被使用的方法?使用覆盖索引
9.字符串不加单引号会导致索引失效
10. 10.少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。
11.范围查询优化
给年龄添加单值索引
ALTER TABLE `employees` ADD INDEX `idx_age` ( `age` ) USING BTREE;
没走索引原因:mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。比如这个例子,可能是由于单次数据量查询过大导致优化器最终选择不走索引优化方法:可以讲大的范围拆分成多个小范围