2011-11-13 55 views
0

我有一個包含10,000,000多行的數據庫表,我正在創建一個新表。什麼是最適合閱讀的存儲引擎類型?擁有10,000,000行數據庫的最佳存儲引擎

目前我使用:

$sql = "UPDATE `packages_unsorted` SET `acv_return_viadetails` = '0';"; 

然後選擇記錄:

$sql = "SELECT * FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

我收集的主鍵id到一個數組名爲$ id和我處理記錄和數據寫入每1000行結束時需要導入一個CSV文件。 然後我和更新acv_return_viadetails領域:

$sql = "UPDATE `packages_unsorted` SET `acv_return_viadetails` = '1' WHERE `id` IN ('".implode("','",$ids)."') LIMIT 1000;"; 

由於上面表中只寫我選擇每次各個領域。我應該使用內存表還是使用其他類型的存儲引擎來加快速度?還是還有其他的優化可以讓我加速呢?

此外,什麼將是一個合理的my.cnf這種操作配置。

感謝提前:)

+1

如果你在調整你的MySQL安裝尋找先進的技術,我會強烈建議http://www.mysqlperformanceblog.com /確定你可以做的所有調整。看不出爲什麼你不能只使用'InnoDb'並確保'acv_return_viadetails'具有'INDEX'。也許如果我們對數據集了解得更多一些,將它分解成更小的表或重新組織數據可能是有意義的。 –

+0

謝謝,我會嘗試Innodb,但我不能真正地分割數據,因爲它是使用LOAD DATA INFILE的直接CSV導入 - 約90個字段* 10M行。 –

+0

innodb - 聚集主鍵看到這裏http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-right-one-on-a/4421601#4421601 –

回答

0

幾點建議:

1)更換

$sql = "SELECT * FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

$sql = "SELECT `id` FROM `packages_unsorted` WHERE `acv_return_viadetails` = '0' LIMIT 1000;"; 

2)檢查是否有可能加載所有ids一次沒有1000的限制。對於10M記錄,應該只需要幾百MB來加載所有ids

$sql = "SELECT `id` FROM `packages_unsorted`"; 

如果不是,請考慮增加限制。

3)你可以嘗試像以下,而不是使用acv_return_viadetails

$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 0, 1000;"; 
$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 1000, 1000;"; 
$sql = "SELECT `id` FROM `packages_unsorted` LIMIT 2000, 1000;"; 
+0

謝謝我理解,但我需要從表格中的所有字段進行處理,所以我必須每次選擇*。我也需要大塊(1000),所以它釋放MySQL服務器的查詢其他表,所以我不能抓住所有的ID:( –

+0

也許你可以選擇'ID',將它們存儲在一個PHP列表和然後逐個處理它們,我相信抓住所有ID不應該花費太多資源。 – nikhil500

1

你對acv_return_viadetails領域的指數?

如果您正在加快導入速度,我只是用C++編寫一個程序,在65秒內將一個300MB文件導入到mysql中。也許你可以適應它,供你使用。

https://github.com/homer6/import-geoip-data

+0

+1分享。你能告訴我什麼是< and >在c + +手段:std :: auto_ptr temp_connection? – Bytemain

+0

這是一個模板。它允許你創建許多不同類型的類。例如,矢量創建了一個整數的向量(這是一個集合)。矢量創建了一個字符串向量。在你提到的情況下,它創建一個auto_ptr到一個sql :: Connection – Homer6

+0

是的我有一個'acv_return_viadetails'索引,但我只能訪問服務器上的PHP,所以我不能使用C++應用程序。我會用它來做其他的事情:) –