索引是 MySQL 中用于加速数据查询的核心数据结构,本质是对表中一列或多列数据进行排序后的 “快速查找目录”。通过索引,MySQL 无需全表扫描即可快速定位目标数据,大幅提升查询效率;但索引会占用额外存储空间,且会降低插入 / 更新 / 删除(写操作)的性能(需同步维护索引结构),因此需合理设计与使用。
无索引时:MySQL 需执行「全表扫描」(逐行遍历表中所有数据),数据量越大,查询越慢;
有索引时:通过索引结构(如 B+Tree)快速定位数据所在的物理位置,查询时间与数据量规模解耦(类似查字典时先查目录,而非逐页翻找)。
保证数据唯一性:如主键索引(PRIMARY KEY)、唯一索引(UNIQUE)可强制列值不重复;
优化排序 / 分组:若查询的 ORDER BY/GROUP BY 子句与索引列一致,MySQL 可直接利用索引的有序性避免额外排序(即 “Using index for 排序” 优化)。
MySQL 绝大多数索引(主键、唯一、普通、联合索引)均基于 B+Tree 实现(InnoDB 引擎默认使用聚簇 B+Tree,MyISAM 用非聚簇 B+Tree),其结构设计专为数据库优化:

B+TREE索引是自平衡二叉树的升级版,B+TREE索引将数据存储在叶子节点,并且叶子节点之间采用双向链表互相连接,这样很适合范围查询,且叶子节点是排好序的。所以我们MySQL数据库是默认根据主键索引升序排序的
B+TREE的非叶子节点只有索引值和指针,没有数据,所以非叶子节点可以存储更多的索引值,这样可以使B+TREE更矮更胖,减少检索的深度(也就是减少磁盘IO),提高检索效率。
作用:用来组织存储表的数据行信息的,也可以理解为数据行信息都是按照聚簇索引结构进行存储的,即按区分配空间的;
特点:索引列数据唯一且非空,一张表只能有一个主键索引;
CREATE TABLE user (
id INT PRIMARY KEY, -- 主键索引
name VARCHAR(20)
);
alter table 表名 ADD PRIMARY KEY (id);
作用:保证数据唯一性(如手机号、邮箱),同时加速查询;
特性:索引列的值必须唯一,但允许有空值
CREATE TABLE user (
id INT PRIMARY KEY,
phone VARCHAR(11) UNIQUE -- 唯一索引
);
ALTER TABLE 表名 ADD UNIQUE 索引名称 on (name) ;
作用:纯粹加速查询,是最常用的索引类型;
特性:无唯一性约束,允许重复值和 NULL;
create table 表名 (id int,name char(10),index 索引名称(name));
create table 表名 (id int,name char(10),index 索引名称(name(5))); -- 设置前缀
create table 表名 (id int,name char(10),age char(5),index xiaoA(name desc)); -- 设置索引排序方式,默认升序
alter table 表名 add index 索引名称(name);
alter table 表名 add index 索引名称(name(length)); -- 设置前缀
alter table 表名 add index 索引名称(name desc) ; -- 调整排序方式
核心特性:基于多列组合创建的索引(如 (col1, col2, col3));
作用:优化多列联合查询(如 WHERE a=? AND b=?),比单列索引更高效;
最左前缀匹配原则—— 查询时必须从索引的第一列开始匹配,否则无法命中索引!!!
例如联合索引 (a, b, c):
命中索引:WHERE a=1、WHERE a=1 AND b=2、WHERE a=1 AND b=2 AND c=3;
未命中索引:WHERE b=2、WHERE a=1 AND c=3(跳过 b 列);
create table 表名 (id int,name char(10),age char(5),index 索引名称(name,age));
alter table 表名 add index 索引名称(name,age);
提高查询性能:通过创建索引,可以大大减少数据库查询的数据量,从而提高查询的速度
加速排序,当查询需要按照某个字段进行排序时,索引可以加速排序的过程,提高排序的效率
减少磁盘的IO,索引可以减少磁盘IO的次数,这对于磁盘读写速度较低的场景,尤其重要
占据额外的存储空间,索引需要占据额外的存储空间,特别是在大型数据库系统中,索引可能占据较大的空间
增删改的操作会导致索引更新,会导致操作的性能降低
资源消耗较大,索引需要占用额外的内存和cpu资源,特别是在大规模并发访问的情况下,可能对系统的性能产生影响
本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/19297863,微信Vac6666666,欢迎交流
登录查看全部
参与评论
手机查看
返回顶部