9. index
需要扫描全部的索引记录时,该表的访问方法就是 index,成本很高 。举例:
mysql> EXPLAIN SELECT key_part1 FROM s1 WHERE key_part3 = 'a'; ---- ------------- ------- ------------ ------- --------------- -------------- --------- ------ ------ ---------- -------------------------- | id | select_type | table | partitions | type| possible_keys | key| key_len | ref| rows | filtered | Extra| ---- ------------- ------- ------------ ------- --------------- -------------- --------- ------ ------ ---------- -------------------------- |1 | SIMPLE| s1| NULL| index | NULL| idx_key_part | 909| NULL | 9688 |10.00 | Using where; Using index | ---- ------------- ------- ------------ ------- --------------- -------------- --------- ------ ------ ---------- --------------------------
possible_keys 和 key在 EXPLAIN 语句输出的执行计划中,possible_keys 列表示在某个查询语句中,对某个表执行单表查询时可能用到的索引有哪些,key 列表示实际用到的索引有哪些 。
有些时候使用到的索引未必在 passible_keys 中,上面 type 为 index 的示例中,passible_keys 显示为 NULL,但实际 key 显示是使用到索引的 。possible_keys 列中的值并不是越多越好,可能使用的索引越多,查询优化器计算查询成本时就得花费更长时间,所以如果可以的话,尽量删除那些用不到的索引 。
key_lenkey_len 列显示 MySQL 决定使用的键长度 。如果键是 NULL,则长度为 NULL 。使用的索引的长度 。在不损失精确性的情况下,长度越短越好。
ref当使用索引列等值匹配的条件去执行查询时,也就是在访问方法是 const、eq_ref、ref、ref_or_null、unique_subquery、index_subquery 其中之一时,ref 列展示的就是与索引列作等值匹配的对象是啥 。如果不是等值查询,则显示为 NULL 。
比如单表查询时肯定是个常数 const:
mysql> explain select * from t1 where a=100; ---- ------------- ------- ------------ ------ --------------- ------ --------- ------- ------ ---------- ------- | id | select_type | table | partitions | type | possible_keys | key| key_len | ref| rows | filtered | Extra | ---- ------------- ------- ------------ ------ --------------- ------ --------- ------- ------ ---------- ------- |1 | SIMPLE| t1| NULL| ref| a| a| 5| const |1 |100.00 | NULL| ---- ------------- ------- ------------ ------ --------------- ------ --------- ------- ------ ---------- -------
而关联查询中则是驱动表的关联字段 t2.a:
mysql> explain select * from t1 join t2 on t1.a=t2.a where t1.a<50;---- ------------- ------- ------------ ------- --------------- ------ --------- ----------- ------ ---------- ----------------------- | id | select_type | table | partitions | type| possible_keys | key| key_len | ref| rows | filtered | Extra| ---- ------------- ------- ------------ ------- --------------- ------ --------- ----------- ------ ---------- ----------------------- |1 | SIMPLE| t2| NULL| range | a| a| 5| NULL|1 |100.00 | Using index condition ||1 | SIMPLE| t1| NULL| ref| a| a| 5| hucq.t2.a |1 |100.00 | NULL| ---- ------------- ------- ------------ ------- --------------- ------ --------- ----------- ------ ---------- -----------------------
rows如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的 rows 列就代表预计需要扫描的行数;如果使用索引来执行查询时,执行计划的 rows 列就代表预计扫描的索引记录行数 。
这有可能是个精确值,也可能是个估算值,计算方法有 index dive 和基于统计索引信息的估算 。
filtered对于单表查询来说:
- 如果是全表扫描,filtered 值代表满足 where 条件的行数占表总行数的百分比;
- 如果是使用索引来执行查询,filtered 值代表从索引上取得数据后,满足其他过滤条件的数据行数的占比 。
推荐阅读
- Win10游戏全屏任务栏无法隐藏的三种解决方法
- 小编教你在oppoa3中打开全屏多任务的方法介绍。
- 小编分享车到哪APP发布任务的操作方法。
- iPhone手机快手任务中心在哪里
- 如何打开任务管理器 打开任务管理器方法
- 血盟荣耀荣誉之路是什么,传奇之路任务奖励
- 奥拉星怎么接任务,《奥拉星手游》晶石获取方法介绍
- 造梦3任务怎么做,我的深圳造梦记
- 天猫精灵怎么设置定时关机 天猫精灵怎样设置定时关机
- 崩坏3驱魔任务能刷什么碎片,每日驱魔选择建议