2014-10-30 65 views
0

我有一个C函数,如下所示,它从别处获取连接,并执行(可能非常大)数量(非常相似)的插入到特定表中。此代码还包括glib.h,my_global.h,assert.hmysql.h(但在此不重要)。代码如下:许多与SQL表非常相似的更新 - 优化?

char* MAKE_TABLE_CMD = "CREATE OR REPLACE TABLE graph (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, weight INT NOT NULL);"; 

char* ADD_ROW_CMD = "INSERT INTO graph (weight) VALUES (0);"; 

gboolean graph_make (MYSQL* conn_ptr, guint64 size) { 
    assert(conn_ptr); 
    if (!mysql_query(conn_ptr, MAKE_TABLE_CMD)) { 
    gboolean loop_successful = TRUE; 
    for (guint64 i = 0; i < size; i++) { 
     if (mysql_query(conn_ptr, ADD_ROW_CMD)) { 
     loop_successful = FALSE; 
     break; 
     } 
    } 
    return loop_successful; 
    } else { 
    return FALSE; 
    } 
} 

当我试图与足够甚至远程大的值使用一个数据库表(10,000行)来保证,它采取的永远到此结束。根据我的分析,这个功能是瓶颈,我猜所有这些都是问题所在。考虑到行的固有相似性,有什么办法可以优化它吗?

声明:我是一个完整的SQL noob。

回答

1

你可以抓住的记录块在一个通插入像这样:

insert into graph (weight) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); 

取决于你有多少条记录插入您可以处理1000(例如)与每个查询,而不是制造记录查询 - >插入 - >确认 - >重复;

1

如果您不能在@Wranorn所说的一个插入查询中使用多个值,并且每次只有一个客户端访问您的数据库,您可以尝试在这些之前禁用自动提交和外键检查大插入并在之后重新启用它。

SET autocommit = 0; --execute this in the beginning 
SET foreign_key_checks=0; 

--execute the insertions 
--.. 

SET autocommit = 1; --execute this in the end 
SET foreign_key_checks=1; 
+0

你和Wranorn的方法可以结合吗? – 2014-10-30 07:56:03

+0

是的,他们可以,但是如果您已经将您的查询修改为像Wranorn建议的那样,结果将不会很重要;因为你只有一个插入语句。 – 2014-10-30 07:58:50