mysql大数量表添加索引方案

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

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

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. 同时指定算法和锁级别

你可以同时指定 ALGORITHM 和 LOCK,例如:

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

4. 注意事项

  • ALGORITHM=INPLACE:

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

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

  • LOCK=NONE:

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

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

总结

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

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

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

相关推荐
SelectDB24 分钟前
开源替代怎么选:能力对照、三条部署路径与四类边界速查
数据库·云原生·开源
SelectDB24 分钟前
自建与托管怎么选:开源自建、私有化与云上托管三条路径速查
数据库·云原生·开源
这个DBA有点耶25 分钟前
深入 OLTP 锁与并发:从行锁到分布式事务的一致性权衡
数据库·架构·产品
SelectDB26 分钟前
数仓 TCO 怎么算:五项成本拆解框架速查
大数据·数据库·开源
虚拟世界AI42 分钟前
Kronos 时间序列数据库新手部署与实战指南
数据库
波力海苔夹心脆6751 小时前
C# 正则表达式零基础入门:从“看得懂“到“会用“
经验分享·后端·mysql·正则表达式·c#
愤怒火龙果1 小时前
AI攻防 AIRT03-RAG Exploitation & Vector Database Attacks
数据库·人工智能·网络安全
SelectDB1 小时前
高并发 BI 看板怎么撑住:隔离与加速配置速查
大数据·数据库·数据分析
l1t2 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
麦壳饼2 小时前
SonnetDB:向量召回率评估中的精确基线与参数记录
数据库·sonnetdb