【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的聚簇索引结构特点。聚簇索引的叶子节点不仅包含主键值,还包含其他所有列的值。虽然主键索引能够快速定位到记录,但当需要访问其他列时,额外的数据读取操作会增加一定的开销。

    可以用一个简单的比喻来理解:聚簇索引就像一个家,主键值相当于门牌号,其他列的值就像家里其他房间的信息。在查询时,系统首先通过门牌号找到门户,然后才进入具体的房间查看其他列的信息。

    这种设计虽然提高了查询效率,但也带来了额外的开销。因此,在实际应用中,选择合适的索引策略对于查询性能至关重要。

    上一篇:【mysql】MySQL中的锁原理(表锁、行锁、间隙锁、共享锁、排他锁)
    下一篇:【Jmeter工具】http请求模拟工具 Jmeter教程入门(二)

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年05月13日 04时33分27秒