mysql - 优化mysql表避免锁定

原文 标签 mysql

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

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

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

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

最佳答案

如果您的表引擎是 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/

相关文章:

php - 从同一张表中多次提取数据?

mysql - SQL-如何使用BETWEEN(mysql)获取一系列时间戳?

c# - C#MySQL读取int32奇怪的行为

mysql - 为什么我可以在innodb的一条记录上拥有两个锁(X和S)?我知道S和X锁不能同时存在

php - 如何在 LIMIT 子句中应用 bindValue 方法?

php - 您的SQL语法错误;检查与您的MariaDB服务器版本相对应的手册以获取正确的语法

mysql - mySQL全文搜索具有特定首字母的单词

php - 简单的 HTML DOM 内存问题

mysql - 如何在MySQL中随意装箱?

php - php-从mysql返回多个值