MySql索引知识点汇总 一(个人总结)

1. 索引到底是什么?(定义)

从官方定义上讲,索引(Index)是帮助存储引擎高效获取数据的数据结构

通俗点说,你可以把它想象成一本书的目录。如果没有目录,你想在 500 页的书中找某个特定的知识点,你得从第一页翻到最后一页(全表扫描);有了目录,你只需要花几秒钟翻到目录页,找到关键词对应的页码,然后直接跳转过去。

核心本质: 索引是用空间换时间。它通过占用额外的磁盘空间来维护一个特定的数据结构,从而极大地降低查询时的 IO 开销。

2. 索引在物理意义上是什么?

在 MySQL(主要指 InnoDB 引擎)中,索引的物理本质是 B+ Tree(B+ 树)

物理存储特征:

  • 文件形式: 在 InnoDB 中,数据和索引是存放在一起的(聚簇索引)。如果你查看磁盘上的数据库文件,通常表现为 .ibd 文件。
  • 数据页(Page): 索引不是零散存储的,而是以“页”为单位(默认 16KB)。
  • 结构层次:
  1. 非叶子节点: 只存储“索引键值”和“指向下一层的指针”,不存储实际的一行行记录。
  2. 叶子节点: 存储了完整的索引键值以及对应的数据。
  3. 双向链表: 叶子节点之间通过双向链表相连,这使得“范围查询”(比如 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知识

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务