MySql索引知识点汇总 一(个人总结)
1. 索引到底是什么?(定义)
从官方定义上讲,索引(Index)是帮助存储引擎高效获取数据的数据结构。
通俗点说,你可以把它想象成一本书的目录。如果没有目录,你想在 500 页的书中找某个特定的知识点,你得从第一页翻到最后一页(全表扫描);有了目录,你只需要花几秒钟翻到目录页,找到关键词对应的页码,然后直接跳转过去。
核心本质: 索引是用空间换时间。它通过占用额外的磁盘空间来维护一个特定的数据结构,从而极大地降低查询时的 IO 开销。
2. 索引在物理意义上是什么?
在 MySQL(主要指 InnoDB 引擎)中,索引的物理本质是 B+ Tree(B+ 树)。
物理存储特征:
- 文件形式: 在 InnoDB 中,数据和索引是存放在一起的(聚簇索引)。如果你查看磁盘上的数据库文件,通常表现为
.ibd文件。 - 数据页(Page): 索引不是零散存储的,而是以“页”为单位(默认 16KB)。
- 结构层次:
- 非叶子节点: 只存储“索引键值”和“指向下一层的指针”,不存储实际的一行行记录。
- 叶子节点: 存储了完整的索引键值以及对应的数据。
- 双向链表: 叶子节点之间通过双向链表相连,这使得“范围查询”(比如
where id > 10)变得异常丝滑。
3. 构建索引的方法
在实际操作中,你可以通过以下几种 SQL 语法来构建索引:
A. 创建表时直接指定
CREATE TABLE users (
id INT PRIMARY KEY, -- 主键索引(特殊的唯一索引)
username VARCHAR(50),
email VARCHAR(50),
INDEX idx_username (username) -- 普通索引
);
B. 使用 ALTER 语句(最常用)
-- 添加普通索引 ALTER TABLE users ADD INDEX idx_email (email); -- 添加唯一索引(约束值不能重复) ALTER TABLE users ADD UNIQUE INDEX uniq_email (email); -- 添加联合索引(同时索引多个列) ALTER TABLE users ADD INDEX idx_user_email (username, email);
C. 使用 CREATE INDEX 语句
CREATE INDEX idx_username ON users(username);
4. 索引的“真面目”:聚簇 vs 非聚簇
理解物理意义时,必须区分这两个概念:
聚簇索引 (Clustered) | 索引即数据。叶子节点直接存放整行数据。通常是主键。 | 一张表只能有一个 |
非聚簇索引 (Secondary) | 索引指向主键。叶子节点存储的是索引列的值 + 对应记录的主键值。 | 可以有多个 |
举个例子: 你通过“非聚簇索引”找数据,就像是先查目录找到页码(主键),然后再翻到那一页去读内容。这个“翻页”的过程,在 MySQL 里叫回表。
MySQL知识点整理 文章被收录于专栏
经典MySQL知识
查看18道真题和解析
美团公司福利 3574人发布