开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
前言
上篇我们学习了MySQL中的数据库优化之索引优化-排序优化。有兴趣的小伙伴可以阅读(MySQL优化之索引优化-排序优化)。
下面我们继续学习MySQL中的数据库优化之索引优化。
分页查询优化
- 在索引上完成排序分页操作,最后根据主键关联回原表查询所需要的其它列内容。
EXPLAIN SELECT *
FROM student t, (SELECT id
FROM student
ORDER BY id
LIMIT 1000, 10
) a
WHERE t.id = a.id;
- 该方法适用于主键自增的表,可以把LIMIT查询转换成某个位置的查询。
EXPLAIN SELECT *
FROM student
WHERE id > 1000
LIMIT 10;
覆盖索引
编写SQL语句时优先使用覆盖索引。直接通过二级索引对应的数据找到了查询结果,无需回表。
- 索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据,当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了满足查询结果的数据就叫做覆盖索引。
- 非聚簇复合索引的一种形式,它包括在查询里的SELECT,JOIN和WHERE子句用到的所有列(即建索引的字段正好是覆盖查询条件中所涉及的字段)。
简单的理解就是,索引列+主键包含SELECT到FROM之间查询的列。
覆盖索引的利弊
利:
- 避免InnoDB表进行索引的二次查询(回表)
- 可以把随机IO变成顺序IO加快查询效率
弊:
索引字段的维护是有代价的,因此,在建立冗余索引来支持覆盖索引时就需要权衡考虑。
今天先学习到这里,明天继续。