mysql>descselect*from world.city;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type |table| partitions |type| possible_keys |key| key_len | ref |rows| filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+|1|SIMPLE| city |NULL|ALL|NULL|NULL|NULL|NULL|4188|100.00|NULL|+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+1rowinset,1 warning (0.00 sec)
mysql>explainselect*from world.city;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type |table| partitions |type| possible_keys |key| key_len | ref |rows| filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+|1|SIMPLE| city |NULL|ALL|NULL|NULL|NULL|NULL|4188|100.00|NULL|+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+1rowinset,1 warning (0.00 sec)
2. 执行计划分析
2.1 type详解
ALL--> INDEX --> RANGE --> REF --> EQ-REF --> CONST 从左到右性能依次变好.ALL :
全表扫描,不走索引
例子:
1. 查询条件列,没有索引
SELECT*FROM t_100w WHERE k2='780P';2. 查询条件出现以下语句(辅助索引列)USE world
DESC city;DESCSELECT*FROM city WHERE countrycode <>'CHN';DESCSELECT*FROM city WHERE countrycode NOTIN('CHN','USA');DESCSELECT*FROM city WHERE countrycode LIKE'%CH%';-- 注意:对于聚集索引列,使用以上语句,依然会走索引DESCSELECT*FROM city WHERE id <>10;INDEX :
全索引扫描
1. 查询需要获取整个索引树种的值时:
DESCSELECT countrycode FROM city
2. 联合索引中,任何一个非最左列作为查询条件时:
idx_a_b_c(a,b,c)---> a ab abcSELECT*FROM t1 WHERE b
SELECT*FROM t1 WHERE c
RANGE :
索引范围扫描
对于辅助索引 ><>=<=LIKEINORbetweenand
对于主键索引 <>NOTIN
例子:
DESCSELECT*FROM city WHERE id<5;DESCSELECT*FROM city WHERE countrycode LIKE'CH%';DESCSELECT*FROM city WHERE countrycode IN('CHN','USA');
注意:
1和2例子中,可以享受到B+树的优势,但是3例子中是不能享受的.
所以,我们可以将3号列子改写:
DESCSELECT*FROM city WHERE countrycode='CHN'UNIONALLSELECT*FROM city WHERE countrycode='USA';
REF:
非唯一性索引,等值查询
DESCSELECT*FROM city WHERE countrycode='CHN';
EQ_REF:
在多表连接时,连接条件使用了非驱动表的唯一索引(uk、pK)DESCSELECT b.name,a.name FROM city AS a
JOIN country AS b
ON a.countrycode=b.code
WHERE a.population <100;DESC country
CONST(SYSTEM):
唯一索引的等值查询
DESCSELECT*FROM city WHERE id=10;