我有一个查询,我正在通过一些字段排列联盟表来处理结果中某些字段可能具有相同值的情况。我很好奇,为什么当后续字段不需要进行二级排序时,查询仍然相当慢。mySQL ORDER优化
典型案例是一张投票表格。 它包含一个total
字段,该字段是一个缓存值votes_up
减去votes_down
。当查询排行榜(如排名前10)时,如果两个总数相等,则按votes_up
订购。最后,如果两者都相同,则可以使用其他字段,例如主键。
下面是一个例子表:
CREATE TABLE `items` (
`id` int unsigned NOT NULL,
`votes_up` mediumint NOT NULL,
`votes_down` mediumint NOT NULL,
`total` mediumint NOT NULL,
PRIMARY KEY (`id`),
KEY `votes_up` (`votes_up`),
KEY `total` (`total`)
)
一个基本的前十名查询与订购的一个领域是快如闪电;例如:
SELECT * FROM `items` ORDER BY `total` DESC LIMIT 10;
(0.00 secs)
添加用于二级排序的votes_up字段会显着减慢它;例如:
SELECT * FROM `items` ORDER BY `total` DESC, `votes_up` DESC LIMIT 10;
(0.15 secs)
添加第三个,即使是主键也会进一步降低速度;例如: -
SELECT * FROM `items` ORDER BY `total` DESC, `votes_up` DESC, `id` DESC LIMIT 10;
(0.18 secs)
有什么办法来优化这个查询,以便当total
字段值都是独一无二的,二次排序的条款将被忽略,不承担那么多的开销?
非常棒。那工作的一种享受。 除了我还必须添加主键。没有在密钥中的'id'只在前两个字段上排序得到改进,将第三个添加到较慢的查询中。 所有这三个是闪电: ALTER TABLE' items' ADD INDEX' leaderboard'('total','votes_up','id') 谢谢! – 2009-12-09 22:39:31
啊,太好了!我想知道为什么你在第三次选择时使用了id,因为它始终是唯一的(作为主键)。看起来像它将与第二个查询相同。 – jonstjohn 2009-12-09 22:42:38