mySQL订单优化

mySQL订单优化,sql,mysql,performance,optimization,Sql,Mysql,Performance,Optimization,我有一个查询,在这个查询中,我按许多字段对一个列表进行排序,以处理结果中某些字段可能具有相同值的情况。我很好奇,为什么在二次排序不需要后续字段的情况下,查询速度仍然慢得多 这方面的例子是一个投票项目表。 它包含一个总计字段,该字段是向上投票数减去向下投票数的缓存值。当查询排行榜时,如果两个总数相等,请说出前10名,然后按票数排序。最后,如果两者相等,则可以使用其他字段,例如主键 下面是一个示例表: CREATE TABLE `items` ( `id` int unsigned NOT N

我有一个查询,在这个查询中,我按许多字段对一个列表进行排序,以处理结果中某些字段可能具有相同值的情况。我很好奇,为什么在二次排序不需要后续字段的情况下,查询速度仍然慢得多

这方面的例子是一个投票项目表。 它包含一个总计字段,该字段是向上投票数减去向下投票数的缓存值。当查询排行榜时,如果两个总数相等,请说出前10名,然后按票数排序。最后,如果两者相等,则可以使用其他字段,例如主键

下面是一个示例表:

 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`)
)
一个基本的前十名查询在一个字段上排序非常快;e、 g:

SELECT * FROM `items` ORDER BY `total` DESC LIMIT 10;
(0.00 secs)
为二次排序添加投票字段会大大降低速度;e、 g:

SELECT * FROM `items` ORDER BY `total` DESC, `votes_up` DESC LIMIT 10;
(0.15 secs)
添加第三个,即使是主键也会进一步降低速度;e、 g:

SELECT * FROM `items` ORDER BY `total` DESC, `votes_up` DESC, `id` DESC LIMIT 10;
(0.18 secs)

是否有任何方法可以优化此查询,以便在总字段值都是唯一的情况下忽略二级排序子句,并且不会产生太多开销?

您可以将结果选择到临时表中,然后从中确定“total”列的唯一性,并相应地管理任何子排序。或者,您可以按“total”将主查询顺序放入视图中,并且只对该视图应用二级排序;这应该会加快速度。

多列索引可能会加快速度。您可以在“总计”和“投票数”上创建索引。添加“id”不会起任何作用,因为它始终是唯一的


使用多列索引时,请始终保持与订购时相同的顺序。

Fablead。那真是一种享受。不过我也必须添加主键。如果键中没有id,则只改进了前两个字段的排序,将第三个字段添加回较慢的查询。所有这三个都是闪电:改变表格项目添加索引排行榜总数,投票,id谢谢!啊,太好了!我想知道为什么在第三个select中有这个id,因为它作为主键总是唯一的。看起来它将与第二个查询相同。谢谢,尽管最初的10行可能不是正确的,所以对它们进行排序是没有意义的。i、 真实的10可能是12,所以不在初始设定中。我并不特别期待极限出现在视图中,但是,是的,我明白你的观点。无论如何,多列索引的另一个答案显然是。。。