
【mysql】全表扫描过程 & 聚簇索引 区别和联系
发布日期:2021-05-08 11:04:58
浏览次数:48
分类:精选文章
本文共 1142 字,大约阅读时间需要 3 分钟。
InnoDB的数据存储结构中,主键索引的作用与其物理存储方式密切相关。默认情况下,InnoDB会为表创建聚簇索引,而主键索引通常是聚簇索引的主要组成部分。这样一来,全表扫描实际上是通过主键索引来执行的。
如果表没有为任何列定义主键,InnoDB会优先为唯一索引或隐藏列创建聚簇索引。这种情况下,虽然没有显式的主键,但仍然存在一种隐式的聚簇索引,这对查询效率有一定的帮助。
接下来让我们分析一个具体的例子。假设我们有一个名为employees2的表,表结构如下:
CREATE TABLE `employees2` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `name` VARCHAR (24) NOT NULL DEFAULT '' COMMENT '姓名', `age` INT (11) NOT NULL DEFAULT '0' COMMENT '年龄', `position` VARCHAR (20) NOT NULL DEFAULT '' COMMENT '职位', `hire_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间', PRIMARY KEY (`id`)) ENGINE = InNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT = '员工记录表';
我们需要比较以下两个查询的效率:
SELECT id FROM employees2;
SELECT age FROM employees2;
通过使用EXPLAIN
命令可以分析查询执行计划。结果如下:
- 对于
SELECT id FROM employees2;
,查询执行计划显示使用了主键索引,具体表现为通过聚簇索引快速定位到记录。 - 对于
SELECT age FROM employees2;
,查询执行计划显示是进行了全表扫描,所有记录都被访问。
这表面上看起来两种查询的效率似乎不一致,但实际上原因在于InnoDB的聚簇索引结构特点。聚簇索引的叶子节点不仅包含主键值,还包含其他所有列的值。虽然主键索引能够快速定位到记录,但当需要访问其他列时,额外的数据读取操作会增加一定的开销。
可以用一个简单的比喻来理解:聚簇索引就像一个家,主键值相当于门牌号,其他列的值就像家里其他房间的信息。在查询时,系统首先通过门牌号找到门户,然后才进入具体的房间查看其他列的信息。
这种设计虽然提高了查询效率,但也带来了额外的开销。因此,在实际应用中,选择合适的索引策略对于查询性能至关重要。