2010-09-10 85 views
4

我有一個mysql數據庫,其中有一個超過600萬行且沒有索引的特定表。一個簡單的查詢,如SELECT ... FROM log ORDER BY log_date ASC將花費不可接受的時間。我顯然需要在表格中添加索引,但我不確定這是最有效的方法。將索引添加到大型mysql表的最有效方法

1)我的第一個選擇是發佈ALTER TABLE log ADD INDEX log_date,但我不確定需要多長時間......是否需要與上一個查詢大致相同的時間長度?如果是這樣,這是不可接受的。

2)我的第二個選擇是導出表,TRUNCATE表,發出ALTER TABLE語句,然後重新導入表數據。我不確定需要多長時間才能重新導入數據,並且擔心繫統在過程中如何嘗試向表中寫入行時會發生什麼情況。

是否有人能夠提供深入瞭解生產系統中中等大型表格而不會導致太多悲傷的最佳方法?

回答

3

據我所知,選項2實際上會導致你比選項1更麻煩,這不僅僅是因爲它涉及更多的數據洗牌,而且因爲將數據導入到表中並同時構建索引花費的時間不僅僅是導入數據,然後構建整個索引。

想想看:如果MySQL導入表中的數據,並在同一時間建立索引,然後在每一行插入它不僅具有插入該行也行插入索引。這將比僅僅從已經存在的數據直接構建索引慢。另一方面,如果你恢復完整的數據,然後建立索引,你回到了選項1,但你同時沒有意義地清空並重新填充表格。

我不認爲你會得到更好的性能,而不僅僅是通過咬咬牙發出ALTER TABLE命令得到公正。也許你可以安排命令在使用率較低的時候運行,比如半夜?

+0

謝謝,Hammerite。 – Timothy 2010-09-10 17:29:37

5

我們的實驗表明,在性能方面的最好的答案是1,創建一個新的空表和索引添加到這一點,那麼原始表複製到它。然後將舊錶重命名爲新名稱,爲新表命名正確的名稱,最後刪除舊錶。

+0

外鍵會發生什麼? – Mowji 2018-01-25 18:20:10