我们遇到一个问题,即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会话中禁用密钥并使其影响从另一个会话发出的导入吗?
答案 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等语句会忽略它们,否则会使用它们。
将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)