快速了解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. 更新频繁的字段慎建索引:如订单状态字段,频繁修改会导致索引频繁维护,抵消查询收益。
相关推荐
张较瘦_2 小时前
MySQL | 文本数据类型(CHAR/VARCHAR/TEXT/BLOB):区别、场景与实战
数据库·mysql
悄悄敲敲敲2 小时前
MySQL内置函数
数据库·mysql
小北方城市网2 小时前
第 5 课:后端工程化进阶 ——Python 分层架构 + 中间件 + 日志 / 异常统一处理(打造企业级高可用后端)
数据库·人工智能·python·mysql·数据库架构
你不是我我3 小时前
【Java 开发日记】我们来说一下 MySQL 的慢查询日志
android·java·mysql
Zhen (Evan) Wang3 小时前
.NET 8 API +Angular 16 + Mysql利用docker compose发布
mysql·.net·angular.js
尽兴-11 小时前
《深入剖析:全面理解 MySQL 的架构设计》
数据库·mysql·数据库架构设计·理解mysql架构
梦幻通灵12 小时前
Mysql字段判空实用技巧
android·数据库·mysql
To Be Clean Coder13 小时前
【Spring源码】getBean源码实战(三)
java·mysql·spring
IT技术分享社区13 小时前
数据库实战:MySQL多表更新JOIN操作的底层原理与性能调优指南
数据库·mysql·程序员