2012-08-24 63 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