欢迎投稿

今日深度:

mariadb,mysql数据库如何快速插入数据到表中,mariadbmysql

mariadb,mysql数据库如何快速插入数据到表中,mariadbmysql


是原文地址:https://mariadb.com/kb/en/mariadb/how-to-quickly-insert-data-into-mariadb/

声明:本人第一次翻译文档,不当之处,请指正。
本文介绍了用于将数据迅速插入到MariaDB数据库中一些和平常不一样的技术。

1.背景

 当插入新数据到mariadb中的表时,下面这些是比较耗时间的事情。
    1.同步数据到磁盘(作为事务的最后的一部分)。
    2.增加新的key.大量索引,花费很多的时间无更新key。
    3.检查外键冲突(如果存在)。
    4.向存储引擎添加行。
    5.发送数据到服务器。

下面开始讨论这些技术.

2.禁用key

你可以临时禁用数据库UNIQUE索引。这种方式对于你的数据中有空行来说事非常有效的。
    ALTER TABLE table_name DISABLE KEYS;
    BEGIN;
    ... inserting data with INSERT or LOAD DATA ....
    COMMIT;
    ALTER TABLE table_name ENABLE KEYS;

在许多存储引擎中(至少有MyISAM 和 Aria),ENABLE KEYS通过扫描行数据和收集键,对它们排序,然后创建索引块来工作。 这比一次创建索引快一个数量级,并且它还使用较少的密钥缓冲存储器。

注意:当你对一个空表执行INSERT或LOAD DATA命令的时候,mariadb会在执行命令之前自动禁用key,在执行命令之后会自动启用key。
当插入大量数据时,完整性检查显然是耗时的。 可以使用unique_checks和foreign_key_checks系统变量禁用UNIQUE索引和外键检查:

SET @@session.unique_checks = 0;
SET @@session.foreign_key_checks = 0;

对于XtraDB 和 InnoDB引擎类型的表,AUTO_INCREMENT锁定模式可以临时设置为2,以下是最快捷的设置方法:

SET @@global.innodb_autoinc_lock_mode = 2;

此外,如果表具有INSERT触发器或PERSISTENT列,您可能需要删除它们,插入所有数据后重新创建它们。

3.加载文本文件

向mariadb中插入数据,最快的方法是使用LOAD DATA INFILE命令。
该命令的最简单的使用方法如下:

LOAD DATA INFILE 'file_name' INTO TABLE table_name;

当你在客户端运行的时候,你可以通过以下命令来读取本地机器上的文件。

LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name;

这种方式没有服务器端读取那么快,但是两者的差别不大。

LOAD DATA INFILE 命令快是因为以下几个原因:

 1. 没有sql解析。
 2. 数据是以大数据库的方式读取。
 3. 如果操作开始之前,目标表是空的,则在操作执行之前会禁用UNIQUE索引。
 4. 引擎被告知先缓存行,然后将它们以数据块的方式插入(至少MyISAM和Aria支持这个)。
 5. 对于空表,一些事务引擎(如Aria)不会在事务日志中记录插入的数据,因为可以通过对表执行TRUNCATE来回滚操作。

因为上面的速度优势,在许多情况下,当你需要一次插入许多行到表中的时候,在本地创建文件,向文件中添加行,然后使用LOAD DATA INFILE加载它们;这种方式相比使用INSERT插入行会快很多。

在MariaDB 5.3中,你还将获得LOAD DATA INFILE的进度报告。

mysqlimport

你可以使用mysqlimport命令并行倒入多个文件。例如:

mysqlimport --use-threads=10 database text-file-name [text-file-name...]

mysqlimport内部也是使用LOAD DATA INFILE读取数据。

4.使用 INSERT 语句插入数据

使用大事务

当使用许多insert语句来插入行的使用,你应该使用BEGIN / END来分割insert语句,避免所有数据使用一个事务(包括磁盘同步)。例如,每1000行数据,使用一次begin和end来分割,将加快你的插入速度。相当于1000行数据提交一次事务。

BEGIN;
INSERT ...
INSERT ...
END;
BEGIN;
INSERT ...
INSERT ...
END;
...

使用多个begin和end来风格插入语句是因为这样会比一次提交,占用更少的事务日志空间。

多值insert

你可以通过多值insert语句一次插入多条记录:

INSERT INTO table_name values(1,"row 1"),(2, "row 2"),...;

一个语句中可以有多少数据的限制由max_allowed_packet服务器变量控制。

一次插入数据到多张表中

如果需要一次将数据插入多个表,最好的方法是启用多行语句并一次性向服务器发送多个插入语句:

INSERT INTO table_name_1 (auto_increment_key, data) VALUES (NULL,"row 1");
INSERT INTO table_name_2 (auto_increment, reference, data) values (NULL, LAST_INSERT_ID(), "row 2");

LAST_INSERT_ID()是一个返回自增列的最后一次值的函数。
默认情况下,命令行mysql客户端将以上多个语句发送。

在客户端中你可以使用以下的方式进行测试:

delimiter ;;
select 1; select 2;;
delimiter ;

注意:要使多查询语句正常工作,客户端必须将CLIENT_MULTI_STATEMENTS标志指定为mysql_real_connect()。

用于调整插入速度的服务器变量如下:

innodb_buffer_pool_size :如果在InnoDB / XtraDB表中有许 多索引,请增加此值。
key_buffer_size: 如果在MyISAM表中有许多索引,请增加此值。
max_allowed_packet:增大此值以允许多值插入语句可以一次插入更多的值。
read_buffer_size:使用LOAD DATA读取文件时读取块大小。

更多的服务器变量请点击这里。


补充:
如果你想将一个表的数据快速导出到一个文件,可以使用以下命令:

SELECT * FROM table_name INTO OUTFILE 'data.txt'  

www.htsjk.Com true http://www.htsjk.com/mariadb/26999.html NewsArticle mariadb,mysql数据库如何快速插入数据到表中,mariadbmysql 是原文地址:https://mariadb.com/kb/en/mariadb/how-to-quickly-insert-data-into-mariadb/ 声明:本人第一次翻译文档,不当之处,请指正。 本文介...
相关文章
    暂无相关文章
评论暂时关闭