2014-10-30 60 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