Tim*_*ock 2 mysql sql optimization performance
我有一个查询,其中我通过许多字段订购一个联赛表来处理结果中某些字段可能具有相同值的情况.我很好奇为什么当次要排序不需要后续字段时,查询仍然慢得多.
一个典型的例子是投票的项目表.它包含一个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`)
)
Run Code Online (Sandbox Code Playgroud)
在一个字段上排序的基本十大查询是快速的; 例如:
SELECT * FROM `items` ORDER BY `total` DESC LIMIT 10;
(0.00 secs)
Run Code Online (Sandbox Code Playgroud)
为次要排序添加votes_up字段可以大大减慢它的速度; 例如:
SELECT * FROM `items` ORDER BY `total` DESC, `votes_up` DESC LIMIT 10;
(0.15 secs)
Run Code Online (Sandbox Code Playgroud)
添加第三个,即使是主键也会进一步降低速度; 例如:
SELECT * FROM `items` ORDER BY `total` DESC, `votes_up` DESC, `id` DESC LIMIT 10;
(0.18 secs)
Run Code Online (Sandbox Code Playgroud)
有没有办法优化这个查询,以便当total字段值都是唯一的,二级排序子句被忽略,并没有产生这么多的开销?
多列索引可能会加快这一速度.您可以在'total'和'votes_up'上创建索引.添加'id'将不会执行任何操作,因为它始终是唯一的.
使用多列索引时,请始终按照与订购时相同的顺序使用它们.