快速了解MySQL索引(什么是索引,分类)

一、索引的本质与核心作用

1.定义

索引是数据库中加速查询的特殊数据结构,类比书籍的目录,通过在表的列上创建索引,能快速定位数据行,避免全表扫描。

2.核心作用

  • 提升查询效率:这是最核心的作用,大幅减少数据库检索数据的IO操作。
  • 保证数据唯一性:如主键索引、唯一索引可约束字段值的唯一性。
  • 优化排序/分组:索引的有序性可减少查询中排序( ORDER BY )、分组( GROUP BY )的计算量。

二、索引的分类

索引类型 定义 核心特点 适用场景 举例
主键索引 基于主键字段创建的索引 自动创建、唯一、不允许为空 表的唯一标识字段 用户表(user)的id字段,唯一标识每个用户
唯一索引 确保索引列值唯一 防止重复,允许一个空值 需唯一约束但非主键的字段 用户表的phone字段,避免重复手机号
普通索引 基础的查询加速索引 无唯一性限制,可建在任意列 普通查询的非唯一字段 商品表的category字段,按分类查商品
全文索引 用于全文搜索的索引 支持复杂文本检索,适配大文本 长文本字段的模糊/关键词搜索 文章表的content字段,搜索包含"数据库"的文章
复合索引 基于多个列创建的索引 加速多列联合查询 多字段组合查询的场景 订单表的 user_id + create_time,按用户 + 时间查订单

三、索引的使用方法(以MySQL为例)

1.创建索引

sql 复制代码
-- 主键索引(建表时自动创建,也可手动指定)
CREATE TABLE user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20)
);

-- 唯一索引
CREATE UNIQUE INDEX idx_user_phone ON user(phone);

-- 普通索引
CREATE INDEX idx_goods_category ON goods(category);

-- 全文索引(仅MyISAM/InnoDB 5.6+支持)
CREATE FULLTEXT INDEX idx_article_content ON article(content);

-- 复合索引
CREATE INDEX idx_order_user_time ON `order`(user_id, create_time);

2.删除索引

sql 复制代码
DROP INDEX idx_user_phone ON user;

四、索引的优缺点

优点

  1. 查询提速:针对大规模数据,能将查询效率从O(n)降至O(log n)(B+树索引)。
  2. 数据约束:主键/唯一索引可保证数据完整性,避免重复值。
  3. 减少IO:通过索引定位数据,减少磁盘的物理读写次数。

缺点

  1. 写入性能下降:新增、修改、删除数据时,需同步维护索引结构,额外消耗资源。
  2. 占用存储空间:索引是独立的数据结构,会占用数据库的磁盘空间(如B+树索引的叶节点/非叶节点存储)。
  3. 维护成本高:过多索引会增加数据库的维护负担,且复合索引需遵循"最左匹配原则",使用不当会失效。

五、索引使用的关键注意事项

  1. 避免过度建索引:仅在常用查询字段上创建,非查询字段无需建索引。
  2. 复合索引遵循最左匹配:如 (a,b,c) 的索引,仅 a 、 a+b 、 a+b+c 的查询能命中, b 、 c 单独查询则失效。
  3. 小表无需建索引:数据量少时,全表扫描的效率可能高于索引查询。
  4. 更新频繁的字段慎建索引:如订单状态字段,频繁修改会导致索引频繁维护,抵消查询收益。
相关推荐
Turnip12021 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
加号32 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏2 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
WeiXin_DZbishe2 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
爱可生开源社区2 天前
MySQL 性能优化:真正重要的变量
数据库·mysql
小马爱打代码2 天前
MySQL性能优化核心:InnoDB Buffer Pool 详解
数据库·mysql·性能优化
风流 少年2 天前
mysql mcp
数据库·mysql·adb
西门吹雪分身2 天前
mysql之数据离线迁移
数据库·mysql
轩情吖2 天前
MySQL初识
android·数据库·sql·mysql·adb·存储引擎
轩情吖3 天前
MySQL库的操作
android·数据库·mysql·oracle·字符集·数据库操作·编码集