Explain详解与索引优化实践(4)

Using filesort:MySQL会对结果使用一个外部索引排序,而不是按照索引次序从表里读取行。此时MySQL会根据连接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化。

① actor.name未创建索引,会浏览actor整个表,保存排序关键字name和对应的id,然后排序name并检索行记录。

执行SQL语句:EXPLAIN SELECT * FROM actor ORDER BY name

② film.name建立了idx_name索引,此时查询时extra是Using index,因为索引底层数据结构已经是排好序的。

执行SQL语句:EXPLAIN SELECT * FROM film ORDER BY name

4、索引优化最佳实践

使用了 employees 员工表:

CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `name` varchar(24) NOT NULL COMMENT '员工姓名',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '员工年龄',
  `position` varchar(20) NOT NULL COMMENT '员工职位',
  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间',
  PRIMARY KEY (`id`),
  KEY `idx_name_age_position` (`name`,`age`,`position`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

insert into `employees` (`id`, `name`, `age`, `position`, `hire_time`) values('1','LiLei','22','manager','2020-02-13 14:22:55');
insert into `employees` (`id`, `name`, `age`, `position`, `hire_time`) values('2','HanMeimei','23','dev','2020-02-13 14:22:57');
insert into `employees` (`id`, `name`, `age`, `position`, `hire_time`) values('3','Lucy','23','dev','2020-02-13 14:22:59');

(1)全值匹配

执行SQL语句:EXPLAIN SELECT * FROM employees WHERE

执行SQL语句:EXPLAIN SELECT * FROM employees WHERE AND age=22

执行SQL语句:EXPLAIN SELECT * FROM employees WHERE AND age=22 AND position='manager'

(2)索引最左前缀原则 

如果索引了多列,要遵循最左前缀原则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

提问:为什么联合索引要想命中索引必须采用最左前缀原则?(命中索引:即是否用到了索引)

以下索引优化规则很多都可以结合下面这张图思考,联合索引底层的索引数据结构图(B+树),索引的排序首先按10002排序,接着是Staff,最后才是1996-08-03,如果不先拿第一个字段10002去比较,根本没法比较,导致无法命中索引。

提问:以下SQL命中索引?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e29ab88dd33cafa3b0071b471ee0ab56.html