5

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

4

2 回答 2

6

是的,您应该从DISABLE KEYS. 它不是会话范围的,它是一个表属性,所以在你这样做之前,你的密钥对所有人都是无效的ENABLE KEYS

于 2009-08-20T17:00:47.190 回答
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 语法

与任何其他存储引擎一起使用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)
于 2012-11-15T10:41:41.077 回答