散分兼请教:多线程数据库编程,运行时间不理想,请高手指点,谢谢
由于需要向数据库中导入数据,使用了mysql数据库,不使用trigger的时间只需要3秒钟就可以导入2,3条记录,但是由于需要做些统计信息,所以需要大约70多秒,这个时间也是可以接受的。
但是现在存在的问题是:数据库里面有20个table,每个table分别从各自对应的一个文件(也就是说有20个文件)中导入,而且trigger的操作都是相同的,在这些操作中只与该表格自身有关,与其他表格没有关系。所以采用了20个线程,每个线程使用自己的一个数据库链接,分别导入数据。但是实际运行效果发现大约需要3分钟。这个时间难以接受,因为要争取实时处理。
其中有些table是很小的,不到1万条数据的大约有14个,2万到3万的有3个,1万到2万的有3个.
另外,每个table没有指定type,不知道是否与这个有关?
数据库连接应该没有问题,都是成功的。
我查看了一下系统管理(linux下top),发现程序运行时,CPU占用了大约20%,然后比较耗费内存的进程是:migration/x, 其中x从0到3,不知道是否是这个有关?
或许是数据库不能同时和20个线程交互?但是插入记录的时间各个表格是互不相关的。
不知道问题出现在哪里?还请高手指点一下,谢谢。
------解决方案--------------------如果没有指定表的type,默认应该是myisam表。这种表的导入可以使用load data infile 语法,导入数据是相当的快啊。但前提是文件中的内容格式要与load data infile语法相兼容。楼主可以试一试
------解决方案--------------------如果触发器中的语句很耗时的话,20个线程一起执行耗时的语句,能快得了嘛?建议你修改应用层的策略
------解决方案--------------------trigger有问题,我觉得你先把数据到进取,看看花多长时间,导完之后,然后使用sql语句处理trigger的业务逻辑,因为trigger是插入一条记录就会执行业务逻辑,如果记录数很多,这样的业务逻辑要执行很多次,还不如全部load完之后,统一处理一下trigger的业务逻辑。当然,这样降低了数据的时时性。