假设 orders 是订单表,user_id 是下单用户编号。给查询加上 EXPLAIN:
EXPLAIN SELECT * FROM orders WHERE user_id = 100;
EXPLAIN 不关心 SQL 返回了什么业务数据;它告诉你 MySQL 准备怎么查。下面是这条查询的一份示意输出,具体值取决于表、索引和数据。
id 是查询步骤编号,select_type 是查询部分的类型,table 是当前访问的表;possible_keys 列出可能使用的索引,key_len 是所用索引键的长度,ref 是拿什么值与索引比较,filtered 是预计过滤后保留的比例。先不用背这些辅助列。
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | orders | ref | idx_user_id | idx_user_id | 8 | const | 20 | 100.00 | NULL |
SIMPLE 表示这是一段简单查询;const 在 ref 列表示拿常量 100 与索引比较;NULL 表示该格没有相应信息。现在只抓主线:用了 idx_user_id,按等值访问,预计检查约 20 行,没显示额外操作。