就是前面说的 MySQL 服务层可以把属于索引的一部分但又无法使用索引的条件下推到存储引擎层,而其他条件还是得在 MySQL 服务层应用来过滤存储引擎层返回的数据。当出现这的情况,执行计划的 extra 字段就会出现 “Using where”,它可以和 “Using index” 一起出现,也可以和 “Using index condition” 一起出现。
- 全表扫描的时候,MySQL 服务层应用 where 条件过滤数据
mysql> explain select emp_no,first_name,last_name from employees where hire_date = '1959-12-06'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: employees
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 299454
filtered: 10.00
Extra: Using where
- 使用索引访问数据,但是 where 子句中有除了该索引包含的字段之外的条件时。
mysql> explain select emp_no,first_name,last_name from employees where first_name='Mayuri' and hire_date = '1959-12-06'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: employees
partitions: NULL
type: ref
possible_keys: idx_a
key: idx_a
key_len: 58
ref: const
rows: 230
filtered: 10.00
Extra: Using where
- 使用索引访问数据,并达到索引覆盖,但是 where 子句中有属于索引一部分但无法使用索引的条件(比如 like ‘%abc’ 左侧字符不确定)条件时:
mysql> explain select first_name,last_name,birth_date from employees where first_name='Mayuri' and last_name like '%Alpay'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: employees
partitions: NULL
type: ref
possible_keys: idx_a
key: idx_a
key_len: 58
ref: const
rows: 230
filtered: 11.11
Extra: Using where; Using index
- 使用索引访问数据,并且使用索引条件下推,并且 where 子句中有除了该索引包含的字段之外的条件时
mysql> explain select * from employees where first_name='Mayuri' and last_name like '%Alpay' and hire_date>'1969-01-01'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: employees
partitions: NULL
type: ref
possible_keys: idx_a
key: idx_a
key_len: 58
ref: const
rows: 230
filtered: 3.70
Extra: Using index condition; Using where