优化MySQL表以避免锁定

3

如何优化MySQL表以避免使用锁定?我能否通过修改表来“关闭”所有时间的锁定。

情况:
我有一个使用1500万记录的数据库的应用程序。每周一次的脚本会在20小时内执行一些任务(插入/更新/删除),而反馈数据给前端(Web服务器)的应用程序服务器也很好,我在那段时间内只看到了非常小的性能损失。

问题:
每个月我需要优化表格,由于存在大量记录,因此完成此任务需要1-2小时(从mysql命令行或phpMyAdmin开始优化,相同),在这段时间内mysql不会向前端提供数据(我认为这是关于锁定表以进行优化的问题)。

问题:
那么如何优化表以避免锁定,因为仅读取数据(没有插入或更新),所以我认为在此情况下,在优化时“解锁”可能不会造成任何损害?


它是InnoDB/MySAM表吗?这将产生重大影响。 - Madhu Beela
1个回答

2
如果您的表引擎是InnoDB并且MySQL版本大于5.6.17,则不会发生锁定。实际上,会有锁定,但时间非常短。
在MySQL 5.6.17之前,OPTIMIZE TABLE不使用在线DDL。因此,在OPTIMIZE TABLE运行时,不允许对表进行并发DML(INSERT、UPDATE、DELETE),并且二级索引的创建效率也不高。
从MySQL 5.6.17开始,OPTIMIZE TABLE对常规和分区InnoDB表使用在线DDL。由OPTIMIZE TABLE触发并由ALTER TABLE ... FORCE在后台执行的表重建是原地执行的,并且仅锁定表格一小段时间,这减少了并发DML操作的停机时间。
请参阅Optimize Tables Official Ref.以获取更多信息。请确保为索引重建准备比当前占用空间更大的可用空间,因为可能会对整个表进行复制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接