Spring Cloud Alibaba中请求个mysql问题,2k万的表 新建索引会锁表吗?create index与alter table add 【ALGORITHM=INPLACE, LOCK=NONE】?
在 Spring Cloud Alibaba 中执行针对具有 2 千万行的表的索引创建操作可能会导致表锁定。当使用 CREATE INDEX
或 ALTER TABLE ADD
命令创建索引时,默认情况下,MySQL 使用的是复制操作(REBUILD)来完成索引的创建,这将涉及到锁定整个表。
然而,MySQL 提供了一些选项来减少索引创建操作对表的锁定时间。其中,您提到了 ALGORITHM=INPLACE, LOCK=NONE
这两个选项:
ALGORITHM=INPLACE
:使用该选项可以尝试使用原地算法来执行索引创建操作,以减少对表的锁定时间。这意味着 MySQL 将尝试在不复制整个表的情况下执行索引创建操作。LOCK=NONE
:使用该选项可以告知 MySQL 在索引创建期间避免进行任何表锁定。请注意,ALGORITHM=INPLACE
和 LOCK=NONE
选项并非所有版本的 MySQL 都支持,且某些条件下可能无法使用。您需要根据您正在使用的 MySQL 版本和配置来确定是否支持这些选项。可以通过查询相关文档或联系 MySQL 支持团队来获取更详细的信息。
在MySQL中,对表进行索引创建或修改时,通常会涉及到表锁的问题。当对表进行操作时,为了保护数据的完整性,MySQL会对表进行加锁,以防止其他并发操作影响数据的一致性。
对于大型表,如2k万的表,创建索引或使用ALTER TABLE
语句修改表结构时,MySQL会使用不同的算法和锁定机制。根据您提供的语句CREATE INDEX
和ALTER TABLE ADD [ALGORITHM=INPLACE, LOCK=NONE]
,我们可以分别进行分析:
CREATE INDEX
:使用CREATE INDEX
语句创建索引时,MySQL会根据索引类型和表的大小选择合适的算法。对于大型表,通常会使用INPLACE
算法来创建索引,这种算法会尝试在表级别锁或行级别锁的帮助下,将索引的创建与表的正常操作结合起来。这意味着在创建索引时,表仍然可以被其他并发操作使用,但会对表的写入操作有一定限制。因此,使用CREATE INDEX
语句创建索引时,表不会完全被锁定,但仍可能对某些操作产生一定的影响。ALTER TABLE ADD [ALGORITHM=INPLACE, LOCK=NONE]
:使用ALTER TABLE
语句修改表结构时,通过指定ALGORITHM=INPLACE
和LOCK=NONE
选项,可以告诉MySQL使用INPLACE
算法进行修改,并且在修改过程中不使用任何锁定机制。这意味着在执行ALTER TABLE
语句时,表不会被完全锁定,其他并发操作可以继续使用表。相对于CREATE INDEX
而言,使用ALTER TABLE ADD [ALGORITHM=INPLACE, LOCK=NONE]
对表的影响会更小。需要注意的是,虽然使用ALTER TABLE ADD [ALGORITHM=INPLACE, LOCK=NONE]
对表的影响较小,但在一些情况下,仍然可能会对表的写入操作产生一定限制。另外,对于不同的存储引擎和表结构,MySQL的锁定机制和行为可能会有所不同。
综上所述,对于2k万的表使用CREATE INDEX
或ALTER TABLE ADD [ALGORITHM=INPLACE, LOCK=NONE]
时,虽然不会完全锁定表,但仍然可能对表的某些操作产生一定的影响。因此,在执行这些操作时,建议评估其对系统性能的影响,并做好相应的备份和风险防范措施。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。