MySQL添加索引的5种方式

 更新时间:2026年03月12日 09:22:06   作者:AI老李  
在MySQL中索引(Index)是数据库优化的核心机制,它像书的目录,帮助快速定位数据,而非全表扫描,本详解聚焦5种常见添加索引方式,基于官方手册与Percona基准,这些方式覆盖80%场景,需要的朋友可以参考下

引言:MySQL索引,查询性能的“秘密武器”

在MySQL中,**索引(Index)**是数据库优化的核心机制,它像书的目录,帮助快速定位数据,而非全表扫描。添加索引可将查询时间从O(n)降至O(log n),2026年MySQL 8.0+的InnoDB引擎支持多种索引类型(如B+树、哈希、全文)。本详解聚焦5种常见添加索引方式:CREATE INDEX、ALTER TABLE、CREATE TABLE时定义、DROP INDEX删除(作为管理补充)、OPTIMIZE TABLE优化。基于官方手册与Percona基准,这些方式覆盖80%场景。目标:掌握后,你能针对表结构选择最佳方式,提升查询速度50%以上。预计阅读时长:15分钟。准备MySQL Workbench?立即建表测试一个PRIMARY KEY!

核心方式速览:添加索引的5种方法表格

以下表格对比5种方式的关键语法、适用性和优缺点(基于MySQL 8.0+,InnoDB默认):

方式序号方法名称核心语法示例适用阶段优缺点性能影响
1CREATE INDEXCREATE INDEX idx_name ON table (col);表已存在简单直接;支持多列(复合)即时生效,锁表短暂
2ALTER TABLE ADD INDEXALTER TABLE table ADD INDEX idx (col);表已存在灵活,支持UNIQUE/FULLTEXT可能重构表(大表慢)
3CREATE TABLE时定义CREATE TABLE table (col INDEX);建表时高效,一步到位;支持多类型建表即优化,无额外开销
4DROP INDEX(管理方式)ALTER TABLE table DROP INDEX idx;索引已存在,需删除重建清理冗余;间接“添加”新索引释放空间,但重建耗时
5OPTIMIZE TABLEOPTIMIZE TABLE table;表已存在,优化碎片碎片整理,提升现有索引效率适用于DELETE/UPDATE后

解读:方式1-3直接添加,4为管理补充,5为间接优化。InnoDB主键自动索引;大表添加索引需OFFLINE模式避免锁。

详细讲解:每种方式的原理、代码与最佳实践

方式1:CREATE INDEX —— 独立创建二级索引

原理:直接在现有表上添加非主键索引,支持单/多列。MySQL创建B+树结构,存储键值+行指针。

作用:快速定位WHERE/JOIN条件,提升SELECT效率。

实战代码

-- 假设表:CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100));

-- 单列索引
CREATE INDEX idx_name ON users (name);

-- 复合索引(多列)
CREATE INDEX idx_name_email ON users (name, email);

-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users (email);

-- 验证
SHOW INDEX FROM users;  -- 查看所有索引
EXPLAIN SELECT * FROM users WHERE name = '张三';  -- 见key: idx_name

输出:EXPLAIN显示使用索引。最佳实践:列选择性高(>10%唯一值)优先;大表用ALGORITHM=INPLACE加速。

方式2:ALTER TABLE ADD INDEX —— 灵活的表结构修改

原理:通过ALTER修改表定义,添加INDEX/UNIQUE/FULLTEXT/SPATIAL。支持原子操作,但大表可能锁表(用COPY算法)。

作用:集成其他变更(如ADD COLUMN),适合生产维护。

实战代码

-- 基本添加
ALTER TABLE users ADD INDEX idx_name (name);

-- 唯一索引
ALTER TABLE users ADD UNIQUE INDEX idx_email (email);

-- 全文本索引(MyISAM/InnoDB)
ALTER TABLE articles ADD FULLTEXT INDEX ft_title (title);

-- 空间索引(InnoDB 5.7+)
ALTER TABLE locations ADD SPATIAL INDEX idx_geom (geom);

-- 验证变更
SHOW CREATE TABLE users;  -- 见索引定义

输出:表结构更新。最佳实践:生产用LOCK=NONE(INPLACE);监控ALTER TABLE ... LOCK=SHARED避免读锁。

方式3:CREATE TABLE时定义索引 —— 建表即优化的“一站式”

原理:在CREATE TABLE中内联定义PRIMARY/UNIQUE/INDEX,确保索引与表同步创建,无额外锁。

作用:新表设计时用,减少后期维护。

实战代码

-- 基本表带索引
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,  -- 主键自动索引
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2),
    INDEX idx_name (name),  -- 二级索引
    UNIQUE INDEX idx_sku (sku)  -- 唯一索引
) ENGINE=InnoDB;

-- 全文索引
CREATE TABLE posts (
    id INT PRIMARY KEY,
    content TEXT,
    FULLTEXT INDEX ft_content (content)
) ENGINE=InnoDB;

-- 验证
SHOW INDEX FROM products;

输出:新表即带索引。最佳实践:PRIMARY KEY放首位;复合索引列顺序:等值在前,范围在后(最左前缀原则)。

方式4:DROP INDEX —— 删除重建的“间接添加”管理

原理:先DROP旧索引释放空间,再用方式1/2添加新索引。适用于替换无效索引。

作用:优化索引策略,防冗余(过多索引增写开销)。

实战代码

-- 删除旧索引
ALTER TABLE users DROP INDEX idx_old_name;

-- 添加新索引(重建)
CREATE INDEX idx_new_name ON users (name(10));  -- 前缀索引,VARCHAR限长

-- 验证
SHOW INDEX FROM users WHERE Key_name = 'idx_new_name';

输出:旧索引消失,新索引生效。最佳实践:大表DROP前备份;用ANALYZE TABLE更新统计信息。

方式5:OPTIMIZE TABLE —— 碎片优化的“间接加速”

原理:重建表/索引,整理碎片(DELETE/UPDATE后),InnoDB用ALTER TABLE ENGINE=INNODB实现。

作用:提升现有索引的扫描效率,非直接添加,但常与新索引结合。

实战代码

-- 优化表(重建索引)
OPTIMIZE TABLE users;

-- 等价ALTER(InnoDB)
ALTER TABLE users ENGINE=InnoDB;

-- 验证碎片减少
SELECT TABLE_NAME, DATA_FREE / 1024 / 1024 AS free_mb
FROM information_schema.TABLES
WHERE TABLE_NAME = 'users';

输出:free_mb降至0。最佳实践:定期运行(cron);MyISAM用OPTIMIZE,InnoDB慎用(在线DDL优先)。

实战方法 论:添加索引的五步框架

基于2026 MySQL最佳实践(如EXPLAIN ANALYZE),以下框架确保索引高效(周期30分钟)。

步骤1:需求分析(5分钟)

  • 行动:用EXPLAIN查慢SQL,选WHERE/JOIN列。
  • 工具:pt-query-digest日志分析。
  • KPI:痛点列覆盖100%。

步骤2:方式选择(5分钟)

  • 行动:建表用方式3;现有表优先方式1。
  • 工具:SHOW INDEX预览。
  • KPI:无冗余索引。

步骤3:执行添加(10分钟)

  • 行动:小表直接,大表用INPLACE。
  • 工具:mysql命令行。
  • KPI:无锁超时。

步骤4:验证效果(5分钟)

  • 行动:前后EXPLAIN对比,测查询时间。
  • 工具:BENCHMARK()函数。
  • KPI:速度提升>30%。

步骤5:维护优化(持续)

  • 行动:定期OPTIMIZE + DROP无效。
  • 工具:cron脚本。
  • KPI:索引命中率>80%。
步骤时长重点工具预期收益
1. 分析5minEXPLAIN精准定位
2. 选择5minSHOW INDEX策略匹配
3. 执行10minALTER/CREATE索引就位
4. 验证5minBENCHMARK效果量化
5. 维护持续OPTIMIZE长期高效

结语:MySQL索引添加,查询魔力的解锁

从CREATE INDEX的简捷到OPTIMIZE的细腻,5种方式铸就了MySQL性能的脊梁——在春川的春日午后(当前KST 11:29,2026.3.7),试着为一个用户表添加name索引并EXPLAIN一个查询,你将见证速度飞跃!

以上就是MySQL添加索引的5种方式的详细内容,更多关于MySQL添加索引方式的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL 的 binlog(Binary Log)日志关闭的方法

    MySQL 的 binlog(Binary Log)日志关闭的方法

    文章介绍了MySQL binlog的作用及关闭方法,binlog用于数据恢复、主从复制和审计,关闭可节省空间,可通过命令检查状态,临时关闭使用SET语句,永久关闭需修改配置文件并重启MySQL,关闭后可手动清理日志文件,感兴趣的朋友跟随小编一起看看吧
    2025-07-07
  • MySQL虚拟列的具体使用

    MySQL虚拟列的具体使用

    虚拟列是一种特殊类型的表列,它不像普通列直接存储数据,而是根据其他列中的数据动态生成,本文主要介绍了MySQL虚拟列的具体使用,感兴趣的可以了解一下
    2024-09-09
  • 了解MySQL查询语句执行过程(5大组件)

    了解MySQL查询语句执行过程(5大组件)

    这篇文章主要介绍了了解MySQL查询语句执行过程(5大组件),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 解析优化MySQL插入方法的五个妙招

    解析优化MySQL插入方法的五个妙招

    本篇文章是对优化MySQL插入方法的五个妙招进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • mysql installer community 5.7.16安装详细教程

    mysql installer community 5.7.16安装详细教程

    这篇文章主要为大家介绍了mysql installer community 5.7.16安装详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • MySQL使用聚合函数进行单表查询

    MySQL使用聚合函数进行单表查询

    这篇文章主要介绍了MySQL使用聚合函数进行单表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Linux利用UDF库实现Mysql提权

    Linux利用UDF库实现Mysql提权

    根据MySQL函数族的可扩展机制,意味着用户可以自己建立包含有自定义函数的动态库来创建自定义函数,简称udf
    2014-07-07
  • mysql between实现选取介于两个值之间的数据范围

    mysql between实现选取介于两个值之间的数据范围

    这篇文章主要介绍了mysql between实现选取介于两个值之间的数据范围,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • MySQL存储过程中变量的定义以及应用详解

    MySQL存储过程中变量的定义以及应用详解

    MySQL变量定义和应用是我们经常会遇到的问题,下面这篇文章主要给大家介绍了关于MySQL存储过程中变量的定义以及应用的相关资料,文章通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • MySQL实现定时自动备份的流程步骤(Windows环境)

    MySQL实现定时自动备份的流程步骤(Windows环境)

    这篇文章主要介绍了MySQL实现定时自动备份的流程步骤(Windows环境),文中通过图文结合的方式介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-12-12

最新评论