用mysql5的C API库函数,mysql_query()。
我程序的目的是从文件们中解析出信息再存入数据库,数据量很大,每一个文件就能插入5000多行,可是速度好慢啊,有什么可以优化的方法吗?表是普通的表格,insert delayed不支持的。
mysql_query()这个函数执行了insert语句,很耗时的,请问各位大侠有没有好方法呢?

解决方案 »

  1.   

    不能用load data infile 吗?
      

  2.   

    一种方案,把从文件中提取的信息另写在一个TXT文件中,然后使用LOAD DATA INFILE 来完成数据库的加载。
      

  3.   

    我以前做过一个mysql的项目,需要设计一个快速上载的机制。最后的解决办法是利用了mysql的预处理语句的特性实现的。mysql的预处理语句支持多行数据的预处理,即 insert into (columnName,columnName,...) values(?,?,...)(?,?,..)...。这样你在绑定输入参数的时候可以在程序里将整张表的数据都绑定好然后调用一次执行就能将整张表的数据插入,比用mysql_query一行一行插入省的几倍的时间。不过你一次发到mysql服务器端的数据多的情况下,要设置my.ini文件下的一个配置项,把服务器允许一次发送的数据包的大小调大就行。
      

  4.   

    我就是一行一行插入,我这里是因为耗用内存太大,用不起,才想转移到硬盘上来的;
    数据库只是程序的临时存储空间,对文件逻辑检查是最终目的。
    资料上说INSERT DELAYED仅适用于MyISAM, MEMORY和ARCHIVE表,不知道怎么建立这三种表呀?
      

  5.   

    用了MEMORY表,并且用INSERT DELAYED语句存入表,结果内存不够导致服务端关闭,表内所有内容全没了。
    不知道还有没有别的什么方法解决,求高手指点。
      

  6.   

    有两种方法,供参考:
    1. 根据表的定义,写程序生成符合要求的txt文件,然后用命令行直接导入。(批处理)
      这个应该速度相当快。只是要注意错误检查。
    2. 调用mysql c api, 最好使用stmt_bind之类的api, 一次可以绑定100行或者更多行。速度也相当不错。
       不要使用mysql_query之类的调用。
      

  7.   

    我用MYISAM表,运行速度还蛮快的,可是存储了一部分后程序自动终止了,郁闷!不知道是程序的问题还是数据库存储有限制的问题,才存储了129个表格,一个表格最大行数为10万。如果找不到原因,你说的方法我看看行不。
      

  8.   

    mysql 安装目录下有个my.ini配置文件,将里面的[mysqld]下添加一行max_allowed_packet = 16M,如果程序还是中途停止就再将那个值加大。
      

  9.   

    谢谢楼上的,我存储10多G的东西,居然可以存下去。
    能不能再问个问题,就是这10多G的东西在哪里呀,我只看到C盘减少了,就是找不到表格存储的位置
    没有在服务器安装目录下,不知道存储到哪里去了
      

  10.   

    innodb的话会存在表空间里面格式为:ibdata或ibd这样的(默认);myisam的话为.MYD的的文件.在data目录下面如:
    mysql> show variables like 'data%'
        -> ;
    +---------------+----------------+
    | Variable_name | Value          |
    +---------------+----------------+
    | datadir       | D:\MySQL\data\ |
    +---------------+----------------+
    1 row in set (0.22 sec)