2010-03-15 120 views
1

我有一個使用一次插入500行的插入操作來導入大量數據(950k行)的進程。這個過程通常需要大約12個小時,這並不算太壞。通常在表上做一個查詢很快(不到1秒),因爲我已經放置了(我認爲是)適當的索引。我遇到的問題是在導入過程正在運行時試圖運行查詢。它使查詢花費近2分鐘!我能做些什麼來使這兩件事不會爭奪資源(或其他)?我已經看過「插入延遲」,但不知道我想將表更改爲MyISAM。插入大量數據時選擇緩慢(MYSQL)

感謝您的幫助!

+0

給出更多細節:表架構+選擇查詢 – zerkms 2010-03-15 01:12:26

+0

ps:加載數據INFILE可能是更好的替代方案,比普通插入 – zerkms 2010-03-15 01:22:51

+0

pps:可能是顯示引擎INNODB狀態可以顯示一些有趣的東西嗎? – zerkms 2010-03-15 01:30:14

回答

1

因此,我最終在導入數據期間搜索時發現速度變慢。我有一個這樣的查詢:

SELECT * FROM `properties` WHERE (state like 'Florida%') and (county like 'Hillsborough%') ORDER BY created_at desc LIMIT 0, 50 

,當我跑了它的解釋,我發現這是圍繞掃描215,000行(即使在發生在州,縣適當的索引)。然後我對以下查詢運行EXPLAIN:

SELECT * FROM `properties` WHERE (state = 'Florida') and (county = 'Hillsborough') ORDER BY created_at desc LIMIT 0, 50 

並看到它只需要掃描500行。考慮到實際結果集大約是350,我想我確定了放緩。

我已經改變了在我的查詢中不使用「like」,並且對更快捷的結果非常滿意。

感謝大家的幫助和建議。他們非常感謝!

+0

不錯。你發現了這個問題。像運營商真的很貪心你的數據。 – darlinton 2010-03-16 16:35:35

0

您可以嘗試將您的數據導入某個輔助表格,然後將其合併到主表格中。你不會在主表中失去性能,我認爲你的數據庫可以比多次插入更快地管理合並。

+0

我最終這樣做了,它有助於加快導入速度,但導入期間搜索的問題仍然存在。謝謝您的幫助! – siannopollo 2010-03-16 12:59:25

+0

試圖找到真正的瓶頸。我認爲它是硬盤 - 所以沒有什麼,但創建一個RAID方案或類似的東西來解決它。進行導入時,請檢查SO和DBMS中的系統狀態(CPU-Memory-Disk活動)。 – darlinton 2010-03-16 16:33:16

1

您是否嘗試過使用優先級提示?

SELECT HIGH_PRIORITY ...INSERT LOW_PRIORITY ...

+0

我敢打賭,他所遇到的最大問題不是適當的指標,而不是優先。 – zerkms 2010-03-15 01:15:31

+0

他表示,具有適當的索引,性能問題只在執行批量插入時出現。 – 2010-03-15 01:17:47

+1

大家都在說謊(c) – zerkms 2010-03-15 01:23:20

1

12小時插入950K行是相當沉重的責任。這些排有多大?他們有什麼樣的指標?即使實際的數據插入很快,索引的持續更新肯定會導致當時使用這些表的任何事情的性能下降。

你是用批量INSERT語法(insert into tab(x)values(a),(b),(c)等等)還是每行一個INSERT執行這些導入?執行批量插入操作需要更長的索引更新週期(因爲它必須爲500行生成索引數據)比單行更快。毫無疑問,在數據更新時,索引上會存在某種內部鎖,在這種情況下,您至少要爭取950k/500 = 1,900次鎖定會話。

我發現,我的一些批量插入腳本(一個HTTP日誌分析器對於一些自定義的數據挖掘),這是更快地在相關表格DISABLE索引,然後重新啓用/數據轉儲後重建他們被完成。如果我沒有記錯,大約37分鐘後插入200,000行命中數據並啓用密鑰,大約3分鐘後沒有索引。