首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行多个查询的c#最佳方式

问运行多个查询的c#最佳方式
EN

Stack Overflow用户
提问于 2014-01-02 17:12:52
回答 2查看 979关注 0票数 2

为了管理C#数据库,我使用了一个mySQL应用程序。

我想做的是:

  • 读一些记录。
  • 运行一些函数来计算“东西”。
  • 在数据库中插入“东西”。

为了计算n个“东西”,我必须已经计算了(n-1)-th“东西”。

我就是这样做的:

声明:

代码语言:javascript
复制
static MySqlCommand cmd;
static MySqlDataReader dr;

我的主循环如下:

代码语言:javascript
复制
for (...)
{
    dr.Close();
    cmd.CommandText = "insert into....";
    dr = cmd.ExecuteReader();
}

这要花很长时间。要插入的行总数约为2.5M。

当我在普通服务器中使用mySql数据库时,大约需要100到150个小时.当我使用本地主机数据库时,大约需要50h。

我想应该有更快的办法。我的想法:

  • 我认为现在我每次循环时都会连接到db,并与db断开连接。是真的吗?
  • 我可以创建一个包含100个查询(用分号分隔)的CommandText。这个是可能的吗?
  • 不要执行查询,而是将它们输出到文本文件中(文件将大约为300 of )。然后使用phpMyAdmin将它们插入数据库(额外的问题:我正在使用phpMyAdmin )。这样可以吗?是否有更好的(也许不是web)界面?)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-02 17:20:10

尝试使用大容量插入。我找到了这个语法here。然后按照SLaks在注释中的建议使用SLaks。这些因素加在一起,可能会大大加快速度。

代码语言:javascript
复制
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
票数 2
EN

Stack Overflow用户

发布于 2014-01-02 18:04:39

您可能正在使用InnoDB作为访问方法。在这种情况下,您应该尝试在事务中每百行左右包装一次INSERT操作。当我不得不处理这种应用程序时,它就产生了巨大的变化。要做到这一点,请按如下方式构造代码:

代码语言:javascript
复制
    MySqlCommand commit;
    start.CommandText = "START TRANSACTION";
    MySqlCommand commit;
    commit.CommandText = "COMMIT";
    int bunchSize = 100;
    int bunch = 0;

    start.ExecuteNonQuery();   /* start the first bunch transaction */

    bunch = bunchsize;
    for(/*whatever loop conditions you need*/) {

        /* whatever you need to do */

        /* your insert statement */
        if (--bunchsize <= 0) {
             commit.ExecuteNonQuery();   /* end one bunch transaction */
             start.ExecuteNonQuery();    /* and begin the next */
             bunchsize = bunch;
        } 
    }
    commit.ExecuteNonQuery();   /* end the last bunch transaction */

您要向其中插入megarows的表也可能包含许多索引。在本例中,您可以通过开始使用以下系列INSERT来加快速度

代码语言:javascript
复制
 SET unique_checks=0;
 SET foreign_key_checks=0;
 ALTER TABLE tbl_name DISABLE KEYS;

然后用这个序列结束。

代码语言:javascript
复制
 ALTER TABLE tbl_name ENABLE KEYS;
 SET unique_checks=1;
 SET foreign_key_checks=1;

在您的软件中,您必须非常小心,以避免插入在使用此技术时会被拒绝为副本的行,因为在这种情况下,启用键操作将无法工作。

有关更多信息,请阅读以下内容:http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20888020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档