我有以下mysqldump文件。我有3个问题:
1。 /* */
中的命令是否已注释掉,或者实际上是否已执行?
2。据官方MySQL documentation说:
mysqldump选项--opt创建快速导入的转储文件 进入InnoDB表,即使没有用SET包装它们 autocommit和COMMIT语句。默认情况下启用opt
但是mysqldump
文件没有包含SET auto commit
和COMMIT
语句,我想知道这些是否隐含?或者我是否需要添加它们。
3。即使我设置unique_checks=0
和foreign_key_checks=0
,如果我有非唯一键,我应该在批量插入之前删除这些键,然后之后重新添加它们,以获得性能,对吧?
-- Server version 5.6.10-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
LOCK TABLES `xxx` WRITE;
/*!40000 ALTER TABLE `xxx` DISABLE KEYS */;
答案 0 :(得分:2)
1。 / * * /中的命令是否被注释掉或者实际上是它们 被执行?
是的,它们实际上正在执行,但仅适用于等于或高于/*!40101
版本号的MySQL版本,如示例所示。根据{{3}}:
如果在“!”字符后添加版本号,则在其中添加语法 仅当MySQL版本大于或时,才会执行注释 等于指定的版本号。
然后到mysqldump
& InnoDB的表现如下:
2。但
mysqldump
文件未包含SET auto commit
和COMMIT
声明,我想知道这些是否隐含?或者我需要添加 它们。
正如the MySQL manual on comment syntax所说:
将数据导入InnoDB时,请确保MySQL没有 启用自动提交模式,因为需要将日志刷新到磁盘 每个插页。要在导入操作期间禁用自动提交, 用SET auto commit和COMMIT语句包围它。
这与此完全不同:
如果使用mysqldump选项--opt,则会获得转储文件 快速导入InnoDB表,即使没有包装它们
SET autocommit
和COMMIT
语句。
实际上并没有停用SET auto commit
和COMMIT
语句。它只是作用于InnoDB设置的默认值,这意味着它是隐式设置的。
3。即使我设置了
unique_checks=0
和foreign_key_checks=0,
,如果我有非唯一键,我应该在删除之前删除这些键。 批量插入,然后重新添加它们,以获得 表现,对吗?
我非常有信心通过mysqldump
导出然后再次导入的行为会自动进行房屋清洁。好的,挖了一些更多&似乎是“随机”键in the official MySQL performance tips。 Paul Dixon回答的明确建议(大胆强调是我的),“您的'真实'关键字段仍然可以编入索引,但对于批量插入,您可能最好在插入后删除并重新创建该索引完整。“