2010-02-15 78 views
7

這可能是一個有點像問串的長度有多長,但統計數據是:需要多長時間在MySQL中使用ALTER TABLE建立索引?

  • 英特爾雙核4GB內存
  • 表有800萬行〜20列,主要是與AUTO_INCREMENT VARCHAR處理主編號
  • 查詢爲:ALTER TABLE my_table ADD INDEX my_index(my_column);
  • my_column爲varchar(200)
  • 存儲是MyISAM的

量級,它應該是1分鐘,10分鐘後,百分鐘?

由於

編輯:行它花費2小時37分鐘,相比爲0小時33分鐘在較小規格的機器上,與基本上相同的設置窗口。我不知道爲什麼花了這麼長的時間。唯一的可能性是,prod機器HD是85%滿,100GB免費。應該夠了,但我想這取決於如何分配自由空間。

+0

測試環境需要多長時間?服務器負載將是你無法解釋的唯一的事情,但我看不到它花了一分多鐘。 –

+0

現在只是在開發環境中運行。我預計大約5分鐘。 30分鐘後還沒有做完。此外,最重要的是,mysqld顯示非常無效,而在開發中,我看到cpu的60%+ –

+0

檢查您的磁盤空間是否已用完,特別是在mysql臨時目錄中。 – nos

回答

5

如果您只是添加單個索引,則需要大約10分鐘。但是,如果您在內存中沒有該索引文件,則需要100分鐘或更長時間。

你200 VARCHAR 800萬行的最大1.6GB的需要,但所有的索引的開銷大約需要2-3 GB。但是如果大多數行少於200個字符,它將會減少。 (您可能想要選擇sum(length(my_column))以查看需要多少空間。)

您想編輯/etc/mysql/my.cnf文件。玩這些設置;

myisam_sort_buffer_size = 100M 
sort_buffer_size = 100M 

祝你好運。

+0

嗨,謝謝你。我之前用〜4mm行做了這個,它完成得非常快,所以是8mm也許我可能把索引推到了磁盤上。 –

1

此外,如果你需要建立多個索引,最好在一個呼叫,而不是單獨...原因創建的所有索引:它基本上apears重寫所有索引頁包容着你的新指數的任何其他它有。我發現過去有一個2+演出表,需要建立約15個索引。在每個索引之間建立所有逐個增長的時間。然後試圖一下子有點超過約3個獨立的指標,因爲它內置每條記錄都寫了有保留重建頁面一下子來代替。

0

在我的測試MusicBrainz數據庫,表track建立在25分鐘一個PRIMARY KEY和三個二級指標:

CREATE TABLE `track` (
    `id` int(11) NOT NULL, 
    `artist` int(11) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `gid` char(36) NOT NULL, 
    `length` int(11) DEFAULT '0', 
    `year` int(11) DEFAULT '0', 
    `modpending` int(11) DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `gid` (`gid`), 
    KEY `artist` (`artist`), 
    KEY `name` (`name`) 
) DEFAULT CHARSET=utf8 

表有9001870記錄。

機器是Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz2Gb RAM,Fedora Core 12,MySQL 5.1.42

@@myisam_sort_buffer_size256M

+0

嗯,我似乎沒有在my.cnf中指定myisam_sort_buffer_size或sort_buffer_size ... –

+0

沒問題,所以它在我的測試環境中完成,它在33分鐘內具有較低的規格(3GB,更慢的cpu)。 Prod仍在攪動。我希望有一個狀態更新或什麼... –

+0

@理查德:如果沒有指定,那麼它有默認值('8M')。你可以通過發出'SELECT @@ myisam_sort_buffer_size'來檢查它。這個值太低了,你應該增加它(特別是如果你有'3 Gb'的'RAM')。該內存僅在創建或修復索引時使用(並分配),因此可以增加索引。 '@@ sort_buffer_size'不影響索引創建速度,它隻影響查詢。 – Quassnoi