网站首页 > 教程文章 正文
mysql增加字段、修改字段、增加索引、调整索引的情况比较复杂,有可能锁表,从而导致其他进程不可访问。如何确保alter语句不会引发锁表呢?
mysql已经提供相关的验证功能,就是在alter语句的末尾增加
ALGORITHM=INPLACE, LOCK=NONE;
当alter语句无法做到不锁表,alter脚本就会执行失败,从而确保alter脚本不会导致锁表。
ALTER TABLE tbl_name ADD index idx_column (column), ALGORITHM=INPLACE, LOCK=NONE;
ALGORITHM=INPLACE
更优秀的解决方案,在当前表加索引,步骤:
1.创建索引(二级索引)数据字典
2.加共享表锁,禁止DML,允许查询
3.读取聚簇索引,构造新的索引项,排序并插
入新索引
4.等待打开当前表的所有只读事务提交
5.创建索引结束
ALGORITHM=COPY
通过临时表创建索引,需要多一倍存储,还有更多的IO,步骤:
1.新建带索引(主键索引)的临时表
2.锁原表,禁止DML,允许查询
3.将原表数据拷贝到临时表
4.禁止读写,进行rename,升级字典锁
5.完成创建索引操作
LOCK=DEFAULT:默认方式,MySQL自行判断使用哪种LOCK模式,尽量不锁表
LOCK=NONE:无锁:允许Online DDL期间进行并发读写操作。如果Online DDL操
作不支持对表的继续写入,则DDL操作失败,对表修改无效
LOCK=SHARED:共享锁:Online DDL操作期间堵塞写入,不影响读取
LOCK=EXCLUSIVE:排它锁:Online DDL操作期间不允许对锁表进行任何操作
- 上一篇: MySQL字段内容拆分及合并
- 下一篇: 对线面试官:MySQL 给数据表增加一列,一定会锁表吗?
猜你喜欢
- 2025-04-26 MySQL与SQLite:如何通过DESCRIBE命令查看表结构并解决常见问题
- 2025-04-26 设计 MySQL 表的 14 条原则
- 2025-04-26 使用MySQL全文索引,我让女同事的代码快了1000倍
- 2025-04-26 mysql 替换某一个字段中的字符串
- 2025-04-26 mysql数据库——约束
- 2025-04-26 Mysql数据库替换整张表中某字段中指定的部分字符
- 2025-04-26 对线面试官:MySQL 给数据表增加一列,一定会锁表吗?
- 2025-04-26 MySQL字段内容拆分及合并
- 2025-04-26 MySQL笔试题-INSERT SELECT批量插入
- 2025-04-26 mysql 之json字段详解(多层复杂检索)
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)