mysql大数量表添加索引方案

在 MySQL 中,ALTER TABLE 语句用于添加索引时,可以通过 ALGORITHMLOCK 子句来指定索引创建的方式和锁级别。虽然 MySQL 官方文档中没有直接支持 WITH ALGORITHM 这样的语法,但你可以使用 ALGORITHMLOCK 选项来控制索引创建的行为。

以下是 ALTER TABLE 添加索引时使用 ALGORITHMLOCK 的示例:

1. 添加索引并指定算法

MySQL 支持在 ALTER TABLE 时指定算法(ALGORITHM),常见的算法包括:

  • ALGORITHM=DEFAULT:由 MySQL 自动选择算法。

  • ALGORITHM=INPLACE:尽量使用原地算法(不复制表数据)。

  • ALGORITHM=COPY:使用复制表数据的方式(较慢,但兼容性更好)。

    ALTER TABLE users ADD INDEX idx_email (email), ALGORITHM=INPLACE;

2. 添加索引并指定锁级别

MySQL 还支持在 ALTER TABLE 时指定锁级别(LOCK),常见的锁级别包括:

  • LOCK=DEFAULT:由 MySQL 自动选择锁级别。

  • LOCK=NONE:不加锁(允许并发读写)。

  • LOCK=SHARED:加共享锁(允许读,不允许写)。

  • LOCK=EXCLUSIVE:加排他锁(不允许读写)。

    ALTER TABLE users ADD INDEX idx_email (email), LOCK=NONE;

3. 同时指定算法和锁级别

你可以同时指定 ALGORITHMLOCK,例如:

复制代码
ALTER TABLE users ADD INDEX idx_email (email), ALGORITHM=INPLACE, LOCK=NONE;

4. 注意事项

  • ALGORITHM=INPLACE

    • 尽量使用原地算法,减少对表数据的复制,但并非所有操作都支持 INPLACE

    • 如果操作不支持 INPLACE,MySQL 会自动回退到 COPY 算法。

  • LOCK=NONE

    • 允许并发读写,但在某些情况下可能会导致操作失败(如需要独占锁的操作)。
  • 性能影响

    • 添加索引时,ALGORITHM=COPYLOCK=EXCLUSIVE 可能会导致表锁定,影响生产环境的读写性能。

总结

  • 使用 ALGORITHMLOCK 可以控制索引创建的方式和锁级别。

  • 在生产环境中,建议优先使用 ALGORITHM=INPLACELOCK=NONE,以减少对业务的影响。

  • 如果不确定操作是否支持 INPLACENONE,可以先测试或查看 INFORMATION_SCHEMA 的相关信息。

相关推荐
荒川之神1 天前
ORACLE 12C/19C 手工建立多租户数据库
数据库·oracle
黑牛儿1 天前
MySQL负载均衡配置详细步骤(新手易操作版)
mysql·adb·负载均衡
a里啊里啊1 天前
常见面试题目集合
linux·数据库·c++·面试·职场和发展·操作系统
北有树1 天前
Redis专题面试题总结
数据库·redis·缓存
cjfeii1 天前
2025年数据库三大顶会论文与Keynote详细介绍
数据库
rannn_1111 天前
【Redis|实战篇7】黑马点评|附近商铺、用户签到、UV签到
java·数据库·redis·后端·uv
kcuwu.1 天前
从Python\+MySQL到Redis:非关系型数据库详解(PyCharm实操版)
redis·python·mysql
鬼先生_sir1 天前
JWT + Spring Security / OAuth2.0:微服务统一登录、鉴权、单点登录全解析
数据库
工具罗某人1 天前
docker compose 部署MySQL InnoDB Cluster + Router 高可用集群-亲测可用
mysql·docker·容器
云边有个稻草人1 天前
KES核心伪列深度解析:OID与ROWID机制、差异及实践
数据库·rowid核心机制·oid 的双重特性