参考:[MySQL高级 EXPLAIN用法和结果分析](https://blog.csdn.net/why15732625998/article/details/80388236)
explain 分析
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
example sql
explain SELECT count(0)
FROM (SELECT min(h.price_normal) minPrice
FROM prod_scenic_spot s
LEFT JOIN prod_scenic_spot_homestay sh ON sh.scenic_spot_id = s.id
LEFT JOIN prod_homestay_new h ON h.id = sh.homestay_id
LEFT JOIN prod_homestay_facility_services hfs ON hfs.homestay_id = h.id
LEFT JOIN prod_homestay_card hc ON hc.homestay_id = h.id
LEFT JOIN vip_card c ON c.id = hc.card_id AND c.status = 1
WHERE h.`status` = 2
AND h.del_flag = 0
AND h.product_type = 6
AND h.one_card_pass_support = 1
GROUP BY s.id) t
结果
id|select_type|table |partitions|type |possible_keys|key |key_len|ref |rows |filtered|Extra |
--+-----------+----------+----------+------+-------------+-------+-------+-------------------------+-----+--------+------------------------------------------+
1|PRIMARY |<derived2>| |ALL | | | | |66934| 100.0| |
2|DERIVED |sh | |ALL | | | | | 81| 100.0|Using where; Using temporary |
2|DERIVED |s | |eq_ref|PRIMARY |PRIMARY|8 |guituke.sh.scenic_spot_id| 1| 100.0|Using index |
2|DERIVED |h | |eq_ref|PRIMARY |PRIMARY|8 |guituke.sh.homestay_id | 1| 5.0|Using where |
2|DERIVED |hfs | |ALL | | | | | 787| 100.0|Using where; Using join buffer (hash join)|
2|DERIVED |hc | |ALL | | | | | 21| 100.0|Using where; Using join buffer (hash join)|
2|DERIVED |c | |eq_ref|PRIMARY |PRIMARY|8 |guituke.hc.card_id | 1| 100.0|Using where |
- id :select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
- select_type :查询类型 或者是 其他操作类型
- table :正在访问哪个表
- partitions :匹配的分区
- type :访问的类型
- possible_keys :显示可能应用在这张表中的索引,一个或多个,但不一定实际使用到
- key :实际使用到的索引,如果为NULL,则没有使用索引
- key_len :表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度
- ref :显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
- rows :根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数
- filtered :查询的表行占表的百分比
- Extra :包含不适合在其它列中显示但十分重要的额外信息