MySQL · 引擎特性 · InnoDB COUNT(*) 笔记

47 阅读2分钟

EXPLAIN执行计划中type字段分为以下几种:

ALL, 扫描全表来找到匹配的行

INDEX, 遍历整个索引来查找匹配的行

RANGE, 索引范围扫描,常见于<、<=、>、>=、between等操作符

REF, 使用非唯一性索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行

EQ_REF, 唯一索引

CONST,SYSTEM 单表中最多只有一条匹配行,查询起来非常迅速,所以这个匹配行中的其他列中的值可以被优化器在当前查询中当做常量来处理。例如根据主键或者唯一索引进行的查询。

NULL

自上而下,性能从最差到最好

在有多个索引的情况下, 在查询数据前,MySQL 会选择成本最小原则来选择使用对应的索引,这里的成本主要包含两个方面。

  • IO 成本: 即从磁盘把数据加载到内存的成本,默认情况下,读取数据页的 IO 成本是 1,MySQL 是以页的形式读取数据的,即当用到某个数据时,并不会只读取这个数据,而会把这个数据相邻的数据也一起读到内存中,这就是有名的程序局部性原理,所以 MySQL 每次会读取一整页,一页的成本就是 1。所以 IO 的成本主要和页的大小有关
  • CPU 成本:将数据读入内存后,还要检测数据是否满足条件和排序等 CPU 操作的成本,显然它与行数有关,默认情况下,检测记录的成本是 0.2。

 -- 全表扫描执行时间: 33 ms

explain SELECT create_time FROM person WHERE NAME >'name84059' AND create_time>'2020-05-23 14:39:18'

-- 使用覆盖索引执行时间: 91 ms

explain SELECT create_time FROM person force index(create_time) WHERE NAME >'name84059' AND create_time>'2020-05-23 14:39:18'