mysql - 优化mysql表避免锁

标签 mysql

如何优化 mysql 表以不使用锁定?我可以更改表以一直“关闭”锁定吗?

情况:
我有使用 15M 记录数据库的应用程序。每周脚本执行一些任务(插入/更新/删除)20 小时,应用服务器将数据提供给前端(网络服务器),这很好,我在这段时间看到的性能损失非常小。

问题:
每月一次我需要优化表,因为那里有大量记录,需要 1-2 小时才能完成此任务(从 mysql 命令行或 phpMyAdmin 开始优化,相同)并且在此期间 mysql 不提供数据前端(我想这是关于锁定表以进行优化)

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

最佳答案

如果您的表引擎是 InnoDB 并且 MySQL 版本是 > 5.6.17 - 不会发生锁定。实际上会有锁,但时间很短。

Prior to Mysql 5.6.17, OPTIMIZE TABLE does not use online DDL. Consequently, concurrent DML (INSERT, UPDATE, DELETE) is not permitted on a table while OPTIMIZE TABLE is running, and secondary indexes are not created as efficiently.

As of MySQL 5.6.17, OPTIMIZE TABLE uses online DDL for regular and partitioned InnoDB tables. The table rebuild, triggered by OPTIMIZE TABLE and performed under the cover by ALTER TABLE ... FORCE, is performed in place and only locks the table for a brief interval, which reduces downtime for concurrent DML operations.

Optimize Tables Official Ref.
最好准备大于表当前占用空间的可用空间,因为索引重建可能会发生整个表复制。

关于mysql - 优化mysql表避免锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9015940/

相关文章:

mysql - 执行捆绑安装时 MySql 出错

mysql - SQL根据第一个表中的时间差连接第二个表

php - 无法插入PHP到MYSQL数据库

mysql - 使用外键代替检查约束

php - 如何使用我的 PHP 代码向外键字段插入值?

mysql - 无法在管理选项卡上呈现外部数据库数据

php - 使用带变量的 PDO 更新 MySQL

sql - 我应该为主键和外键使用 ENUM 吗?

mysql - UPDATE值如果大于0怎么办?

mySQL alter table on update,当前时间戳