[英]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等语句会忽略它们,否则它们会使用它们。
将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.