7种提高Mysql 数据插入的方式
1) 使用 LOAD DATA INFILE ,
这种读入文本文件的方式会比普通的insert 语句快很多(10 倍以上)
2) 使用批量插入
insert into xxx_table (xxx_column) values(x1,x2,x3),(y1,y2,y3),(z1,z2,z3);
3) 对myisam tables 开启 concurrent inserts
concurrent_insert global 变量用来控制并行插入的,默认是1,如果设成0表示不用并行插入, 如果设成2表示即使表有删除的数据,也可以并行插入到表的末尾. 使用set global concurrent_insert = 1.
4) use insert delayed
这个文档上写的很清楚了. 当你不用等待插入完成的时候,尤其是记录logging 并且你同时要使用会运行很长时间的select 或update 语句的时候.当你使用insert delayed 服务器会马上返回, row 会被排进队列,直到table 没有被其他人使用. insert delayed into xxx_table(xxx_column) values (x1,x2,x3)
5) 对非事务性表使用lock table
当你lock table 之后插入,你的index buffer 只有在全部insert 完成之后flush 一次,比普通的不lock table 会flush 很多次的性能要好. 对事务性的插入操作,还是要显示start transaction 并且commit , 而不是lock table. 这个对不要求7×24 高可用的数据库很有用, 数据仓库导数据的时候也很适合.
6) set unique_checks 和 set foreign_key_checks
当执行大量插入操作的时候,set unique_checks=0 和set foreign_key_checks=0 会关闭掉主键唯一性检查和外键检查,当你插入完的时候再设置成1.
7) 使用64 位的mysqlinsert 命令
使用mysql 自带的mysqlinsert 并且使用—parallel=4 , parallel 参数一般选2的指数,代表开启并行度,另外一个就是-C 代表compress ,服务器和客户端都同时压缩之后再传输. 注意,这个只有在最新的64 位版本中才有,并且请使用mysql 5.1.41 之后的版本.
其实linux 下很多工具集都已经不适合在64 位下使用,因为原来编写的时候在32位上,并没有考虑多核的性能,像是gzip 的效率在64位,尤其是服务器硬件有4个甚至8个cpu 的linux 版本上效率比像是LZMA 的性能差很多,所以在64 位上尤其服务器上尽量使用64 位特有的一些工具集.
参考资料
http://www.rawseo.com/news/2009/03/30/5-ways-to-optimize-mysql-inserts/