MySQL优化之索引优化(七)

55 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

前言

上篇我们学习了MySQL中的数据库优化之索引优化。有兴趣的小伙伴可以阅读(MySQL优化之索引优化(六))。
下面我们继续学习MySQL中的数据库优化之索引优化。

索引下推

Index Condition Pushdown(ICP)是MySQL5.6的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。ICP可以减少存储引擎访问基表的次数以及MySQL服务器访问存储引擎的次数。

ICP的使用条件

  1. 只能用于二级索引
  2. explain显示的执行计划中tpe值(join类型)为range、ref、eq_ref或ref_or_null
  3. 并非全部where条件都可以用ICP筛选,如果where条件的字段不在索引列中,还是要读取整表的记录到server端做过滤。
  4. ICP可以用于MyISAM和InnoDB存储引擎。
  5. MySQL5.6版本的不支持分区表的ICP功能,5.7版本的开始支持。
  6. 当SQL使用覆盖索引时,不支持ICP的优化方法。

普通索引和唯一索引

从性能角度考虑,这两个索引如何选择。先创建一张表,主键列id,字段k,并且k上创建索引。语句如下:

CREATE TABLE test(
    id INT PRIMARY KEY,
    k INT NOT NULL,
    name VARCHAR(16),
    index(k)
)engine=InnoDB;

插入几个值(100,1),(200,2),(300,3),(400,4),(500,5),(600,6)。

查询以下数据:

SELECT ID
FROM test
WHERE k = 5;
  • 对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足k=5条件的记录。
  • 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。

对查询来说,以上两种不同的方式,性能差异不大。

今天先学习到这里,明天继续。