mysql:优化查询w / mixed-ascendency ORDER BY

时间:2010-03-04 16:26:16

标签: database mysql query-optimization innodb

我有一个大表(现在约1M行,很快~10M),它有两个排名列(除常规数据外):

  • avg_visited,浮点数0-1代表年龄百分比;越高越好
  • alexa_rank,1-N整数,给出先验排名

先验排名来自外部来源,因此无法更改。许多行还没有流行(因为还没有用户点击它),所以先验排名是后备顺序。然而,流行度确实经常发生变化 - 更新旧条目以及将流行度添加到以前只具有先验排名的流行度,如果某个用户真正点击它。

我经常运行SELECT id, url, alexa_rank, avg_visited FROM个网站ORDER BY avg_visited desc, alexa_rank asc LIMIT 49500, 500(各种值为49500)。

但是,ORDER BY不能使用每http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

混合优势的索引

这是在mysql 5.1,innodb。

如何才能最好地改变这种情况,为我提供一个理智的,完全索引的查询?

2 个答案:

答案 0 :(得分:1)

不幸的是,MySQL不支持索引中的DESC子句,也不支持派生表达式的索引。

您可以将负面流行度与正面流行度一起存储,并在ORDER BY

中使用它
CREATE INDEX ix_mytable_negpopularity_apriori ON (neg_popularity, a_priori);

INSERT
INTO    mytable (popularity, neg_popularity)
VALUES  (@popularity, -@popularity);

SELECT  *
FROM    mytable
ORDER BY
        neg_popularity, a_priori

答案 1 :(得分:1)

只是一个简单的黑客:

因为流行度是0到1之间的浮点数。你可以将它乘以-1,数字将介于-1到0之间。

这样您就可以将受欢迎程度的排序顺序反转为ORDER BY popularity ASC, a_priori ASC

不确定开销是否会增加收益。

这让我想起了以反向形式存储电子邮件的黑客行为。