快速了解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. 更新频繁的字段慎建索引:如订单状态字段,频繁修改会导致索引频繁维护,抵消查询收益。
相关推荐
余槐i1 小时前
数据没回滚也不报错:@Transactional 自调用失效的 3 种复现与修复
spring boot·mysql·多线程·spring 事务
写后端的胖头鱼6 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
code_whiter8 小时前
01-MySQL数据库基础
数据库·mysql
vx_Biye_Design10 小时前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
做运维的阿瑞11 小时前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
java1234_小锋12 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
专业程序开发源12 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
jason.zeng@150220712 小时前
canal做mysql的异步传输工具
数据库·mysql·linq
Shadow(⊙o⊙)13 小时前
MySQL C/C++链接MySQL使用
数据库·sql·mysql
FYKJ_201013 小时前
springboot手工蜀绣在线销售系统60947-计算机课程设计、毕业设计
java·spring boot·后端·python·mysql·spark·课程设计