php批量写入MySQL的第二方法

  之前在一个出入库的系统里用了Sqlbulkcopy函数来进行对数据批量写入到SQL Server里,效果非常好,比传统的Insert into的效率高了很多。于是在对php批量写入到MySQL这个问题上,有了“块写入”的想法。对于php的了解并不多,只是配合我的师傅阿明,来解决大数据批量写入慢的问题。

  写入MySQL的是用Load的方法,该方法的执行机制是先将数据生成为一个.txt的文本文件,然后通过导入到MySQL来实现写入操作的。可以来分析一下,其实整个操作包含两个步骤:

  1、将数据生成为磁盘上的一个文本。(第一次写入磁盘)

  2、将这个文本导入到目标数据库。(第二次写入磁盘)给一个代码片段:

$sql="load data infile '$filepath' into table ".$table." character set gbk fields terminated by ':|' lines terminated by ',' (`id`,`name`,`age`);";
$db->ExcNonQuery($sql);

看到了,一共是两次的磁盘操作。我们知道目前,计算机最大的瓶颈是磁盘,那么这里对“瓶颈”进行了两次操作,这个导致的结果必须是慢啊,无尽的慢————囧。文档都找到MSDN上了,看到.NET有一个MemoryStream的函数,是一个流操作,把信息写入到内存里。这个方法让我想到了,如果在生成的操作可以在内存里执行,那么整个行为就会快很多。

  可是,问题又来了,数据是生成在内存里,但是没有办法知道写入的内存地址,无法读到数据。。。于是这样一个方法出现了,我把它叫做:php批量写入MySQL的第二方法。为什么怎么叫,因为我对php了解不多,兴许有更好的方法说不定。不卖关子,直接坦白:利用Ramdisk(虚拟硬盘软件)虚拟出一个内存盘,将第一步的操作放在这个内存盘里执行。可以来看一下:

来看一下这个“磁盘的性能”:

用红线框框这的,一个是平均读取速度,一个是突发读取速度,很惊人,任何一个硬盘都达不到的传输率。也就是这个盘解决了,生成一亿条数据,再写入到数据库的短时操作。姑且就叫做第二方法吧~

posted on 2011-04-22 17:22  Devil.Waltz  阅读(2030)  评论(3编辑  收藏  举报

导航