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

时间:2009-08-20 16:45:35

标签: mysql foreign-keys indexing mysqldump

我们遇到一个问题,即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会话中禁用密钥并使其影响从另一个会话发出的导入吗?

2 个答案:

答案 0 :(得分:5)

是的,你应该从DISABLE KEYS中获得显着的好处。它不是会话范围的,它是一个表属性,因此在你执行ENABLE KEYS之前,你的密钥对每个人都是死的。

答案 1 :(得分:4)

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 Syntax

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)