2012-08-24 64 views
0

我有一個從服務器端獲取數據的數據表,我想通過添加索引來優化我的表,以便排序更快(現在,大約需要7秒來對60K行進行排序)添加索引到表

我的「複製創建語句到剪貼板」看起來是這樣的:

CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `password` char(128) COLLATE utf8_unicode_ci NOT NULL, 
    `salt` char(5) COLLATE utf8_unicode_ci NOT NULL, 
    `joined` int(10) unsigned NOT NULL, 
    `name` varchar(60) COLLATE utf8_unicode_ci NOT NULL, 
    `surname` varchar(60) COLLATE utf8_unicode_ci NOT NULL, 
    `role` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `photo` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `user_type` int(11) DEFAULT NULL, 
    `user_owner` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `email` (`email`) 
) ENGINE=InnoDB AUTO_INCREMENT=81634 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

說我遇到的問題是,如果我用這個:

ALTER TABLE `users` ADD INDEX (`email`, `name`, `surname`, `user_type`) ; 

只有電子郵件進行索引(LEA處只有電子郵件欄可以快速排序)。我不知道我能做些什麼來添加其他索引列(或者如果它實際上對於優化它是很有用的)。

回答

1

您必須爲要使用的每個列添加單獨的索引。

但請注意:MySQL只能使用where子句的索引,或者按順序使用索引。但不是一次。除非,兩者都是相同的指數。但在這種情況下,where子句必須是常量(即它必須匹配單個值)。

另請參閱:http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

+0

它似乎不適用於每列的單獨索引。實際上,如果我只是執行ADD INDEX(電子郵件),這個索引對排序沒有任何好處,但如果我執行ADD INDEX(電子郵件,姓名,用戶類型),那麼電子郵件列幾乎立即被排序...任何想法爲什麼發生這種情況? – luqita

+1

@luqita爲這兩種方式發佈解釋計劃。 – Ariel

+0

我不明白你的問題......解釋兩種方式顯示相同的東西:( – luqita