我有一个大表(现在约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。
如何才能最好地改变这种情况,为我提供一个理智的,完全索引的查询?
答案 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
不确定开销是否会增加收益。
这让我想起了以反向形式存储电子邮件的黑客行为。