2016-03-28 63 views
-2

我对使用C#的程序的性能有问题。mySQL - 插入数据的时间很慢

在第一个循环中,表格将插入并更新175000条记录,时间为54秒。 在第二个循环中,有175000条记录,1分11秒。 接下来,第三个循环,18195 1分28秒。 循环进行和花费的时间多于125条记录可能会长达2分钟。

我想知道为什么较小的记录需要更长的时间来更新?更新的记录数量是否对完成循环所花费的时间没有影响?

任何人都可以在这方面启发我吗?

流方案:

插入表A(日期,时间)选择日期,从rawdatatbl时间其中id> = startID & & ID < = maxID; // startID是最后一个记录

更新表A组列名=值,columnName1 =值,columnName2 =值,COLUMNNAME .....

我使用InnoDB的下一个ID。

+1

请显示您询问的代码。 –

+0

正在执行所有三个循环中的插入和更新? –

+0

@ un-lucky是的,对于这个表A,每个循环都会通过从其他表中选择日期和时间来表示日期和时间,然后程序将更新表中的值A – njz

回答

2

报告的行为似乎与日益增长的表大小以及针对UPDATE语句的低效查询执行计划一致。最可能的解释是,UPDATE正在执行全表扫描以定位要更新的行,因为没有适当的索引。而且随着表格添加越来越多的行,执行全表扫描所需的时间越来越长。

快速建议:

回顾查询执行计划

(通过运行EXPLAIN获得)验证适合的索引信息,并将正在使用

除此之外,还有的MySQL实例本身的调整。但这取决于表使用哪个存储引擎,MyISAM,InnoDB等。

+0

我使用InnoDB – njz

0

请提供SHOW CREATE TABLE这两个表和实际的语句。这里有一些猜测......

  • 目标表有索引。由于索引是在插入发生时构建的,因此任何“随机”索引都会变得越来越慢。
  • innodb_buffer_pool_size太小了,缓存成了一个问题。
  • UPDATE似乎是一个全表更新。那么,每次表格都会更大。
  • 你是如何从一个查询中获得startID之后再进行下一个查询的(其中有id>=startID)?当你进入桌子时,代码可能会变慢。
  • 你说“在第二个循环”中,“循环”在哪里?或者你指的是INSERT...SELECT作为“循环”?