繁体   English   中英

MySQL“set unique_checks”,“set foreign_key_checks”与“alter table disable keys”

[英]MySQL “set unique_checks”, “set foreign_key_checks” vs. “alter table disable keys”

我们遇到一个问题,即mysqldump脚本占用90%的时间来填充它处理的少量表。 消除FK和索引消除了速度问题,但不是一个可接受的解决方案。

转储脚本确实有:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

我们可以期待ALTER TABLE foo DISABLE KEYS任何不同行为吗?

此外, disable keys会话范围的还是永久性的,直到我重新启用它? 我可以从一个mysql会话中禁用密钥并使其影响从另一个会话发出的导入吗?

是的,您应该从DISABLE KEYS获得显着的好处。 它不是会话范围的,它是一个表属性,所以你的密钥对每个人来说都是死的,直到你做了ENABLE KEYS

DISABLE KEYS仅限MyISAM:

如果在MyISAM表上使用ALTER TABLE,则所有非唯一索引都在单独的批处理中创建(与REPAIR TABLE一样)。 当你有很多索引时,这应该使ALTER TABLE更快。

可以为MyISAM表显式激活此功能。 ALTER TABLE ... DISABLE KEYS告诉MySQL停止更新非唯一索引。 然后应该使用ALTER TABLE ... ENABLE KEYS来重新创建缺失的索引。 MySQL使用一种比逐个插入密钥快得多的特殊算法来实现这一点,因此在执行批量插入操作之前禁用密钥应该会带来相当大的加速。 使用ALTER TABLE ... DISABLE KEYS除了前面提到的权限外,还需要INDEX权限。

虽然非唯一索引被禁用,但是对于SELECT和EXPLAIN等语句会忽略它们,否则它们会使用它们。

来自ALTER TABLE语法

DISABLE KEYS与任何其他存储引擎一起使用会产生警告:

mysql> ALTER TABLE `foo` DISABLE KEYS;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings \G
*************************** 1. row ***************************
  Level: Note
   Code: 1031
Message: Table storage engine for 'foo' doesn't have this option
1 row in set (0.00 sec)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM