mysqldump行为和相关的InnoDB性能

时间:2014-05-22 23:11:56

标签: mysql performance innodb

我有以下mysqldump文件。我有3个问题:

1。 /* */中的命令是否已注释掉,或者实际上是否已执行?

2。据官方MySQL documentation说:

  

mysqldump选项--opt创建快速导入的转储文件   进入InnoDB表,即使没有用SET包装它们   autocommit和COMMIT语句。默认情况下启用opt

但是mysqldump文件没有包含SET auto commitCOMMIT语句,我想知道这些是否隐含?或者我是否需要添加它们。

3。即使我设置unique_checks=0foreign_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 */;

1 个答案:

答案 0 :(得分:2)

  

1。 / * * /中的命令是否被注释掉或者实际上是它们   被执行?

是的,它们实际上正在执行,但仅适用于等于或高于/*!40101版本号的MySQL版本,如示例所示。根据{{​​3}}:

  

如果在“!”字符后添加版本号,则在其中添加语法   仅当MySQL版本大于或时,才会执行注释   等于指定的版本号。

然后到mysqldump& InnoDB的表现如下:

  

2。mysqldump文件未包含SET auto commitCOMMIT   声明,我想知道这些是否隐含?或者我需要添加   它们。

正如the MySQL manual on comment syntax所说:

  

将数据导入InnoDB时,请确保MySQL没有   启用自动提交模式,因为需要将日志刷新到磁盘   每个插页。要在导入操作期间禁用自动提交,   用SET auto commit和COMMIT语句包围它。

这与此完全不同:

  

如果使用mysqldump选项--opt,则会获得转储文件   快速导入InnoDB表,即使没有包装它们   SET autocommitCOMMIT语句。

实际上并没有停用SET auto commitCOMMIT语句。它只是作用于InnoDB设置的默认值,这意味着它是隐式设置的。

  

3。即使我设置了unique_checks=0foreign_key_checks=0,,如果我有非唯一键,我应该在删除之前删除这些键。   批量插入,然后重新添加它们,以获得   表现,对吗?

我非常有信心通过mysqldump导出然后再次导入的行为会自动进行房屋清洁。好的,挖了一些更多&似乎是“随机”键in the official MySQL performance tips。 Paul Dixon回答的明确建议(大胆强调是我的),“您的'真实'关键字段仍然可以编入索引,但对于批量插入,您可能最好在插入后删除并重新创建该索引完整。“

相关问题