# 大批量插入数据

## MyISAM 表

对于 MyISAM 存储引擎的表，可以通过以下方式快速地导入大量的数据：

```sql
ALTER TABLE <table_name> DISABLE KEYS;

LOAD DATA INFILE 'file_name' INTO TABLE <table_name>;

ALTER TABLE <table_name> ENABLE KEYS;
```

<mark style="color:blue;">**DISABLE KEYS**</mark> 和 <mark style="color:blue;">**ENABLE KEYS**</mark> 用来**打开**或者**关闭** MyISAM 表**非唯一索引的更新**。

* 在导入大量的数据到一个**非空的** MyISAM 表时，通过设置这两个命令，可以提高导入的效率。
* 对于导入大量数据到一个**空的** MyISAM 表，默认就是先导入数据然后才创建索引的，所以不用进行设置。

## InnoDB 表

对于 InnoDB 类型的表，可以有以下几种方式提高 InnoDB 表的导入效率：

1. 因为 InnoDB 类型的表是按照主键的顺序保存的，所以<mark style="color:blue;">**将导入的数据按照主键的顺序排列（文件内）**</mark>，可以有效地提高导入数据的效率。
2.  <mark style="color:blue;">**在导入数据前执行 SET UNIQUE\_CHECKS=0**</mark>，关闭唯一性校验；<mark style="color:blue;">**在导入结束后执行 SET UNIQUE\_CHECKS=1**</mark>，恢复唯一性校验，可以提高导入的效率。

    ```sql
    SET UNIQUE_CHECKS = 0;

    LOAD DATA INFILE 'file_name' INTO TABLE <table_name>;

    SET UNIQUE_CHECKS = 1;
    ```
3.  如果应用使用自动提交的方式，建议**在导入前执行 SET AUTOCOMMIT=0**，关闭自动提交；**导入结束后再执行 SET AUTOCOMMIT=1**，打开自动提交，也可以提高导入的效率。

    ```sql
    SET AUTOCOMMIT = 0;

    LOAD DATA INFILE 'file_name' INTO TABLE <table_name>;

    SET AUTOCOMMIT = 1;
    ```
