首页 > 数据库 > 数据库开发技术 > MySQL全表扫描一定存在性能问题吗?
示例数据:https://github.com/dongxuyang1985/thinking_in_mysql
EXPLAIN
SELECT *
FROM employee;
Name |Value |
-------------+--------+
id |1 |
select_type |SIMPLE |
table |employee|
partitions | |
type |ALL |
possible_keys| |
key | |
key_len | |
ref | |
rows |25 |
filtered |100.0 |
Extra | |
EXPLAIN
SELECT *
FROM employee
WHERE emp_id = 10;
Name |Value |
-------------+--------+
id |1 |
select_type |SIMPLE |
table |employee|
partitions | |
type |const |
possible_keys|PRIMARY |
key |PRIMARY |
key_len |4 |
ref |const |
rows |1 |
filtered |100.0 |
Extra | |
EXPLAIN
SELECT *
FROM employee
WHERE emp_id BETWEEN 10 AND 12;
Name |Value |
-------------+-----------+
id |1 |
select_type |SIMPLE |
table |employee |
partitions | |
type |range |
possible_keys|PRIMARY |
key |PRIMARY |
key_len |4 |
ref | |
rows |3 |
filtered |100.0 |
Extra |Using where|
表中的数据量很小,以至于全表扫描比索引查找更快。尤其是基于辅助索引的范围扫描,因为扫描索引之后还需要回表查询数据,这种查询是随机 IO。例如,数据量少于 10 条的配置表就可以通过全表扫描快速获取数据。
查询语句中没有基于索引字段的过滤条件;或者基于索引的查询条件需要返回表中的一大部分数据,导致全表扫描速度更快。一种应用场景就是数据仓库中的聚合分析,通常需要汇总整个表中的数据。
索引的基数(不同值)太小,例如性别字段的单独索引。这种情况下,MySQL 会认为索引需要查找很多记录,性能不如全表扫描。
原文作者:SQL编程思想;如有侵权,请联系管理员删除。