【问题标题】:MySQL: adding a position columnMySQL:添加位置列
【发布时间】:2010-02-06 17:18:26
【问题描述】:

给定一张桌子:

id | score | position
=====================
 1 |    20 |        2
 2 |    10 |        3
 3 |    30 |        1

我可以使用什么查询来优化使用(不可为空的)得分列设置位置列?

(我确定我以前见过这个,但我似乎无法找到正确的关键字来找到它!)

【问题讨论】:

    标签: mysql optimization


    【解决方案1】:
    set @rank = 0;
    update tbl a join (select score, @rank:=@rank+1 as rank from tbl group by score
      order by score desc) b on a.score = b.score set a.position = b.rank;
    

    一举更新位置就可以了。分数相同,位置相同

    【讨论】:

    • 啊,谢谢,看起来像 rank 是我早该使用的关键字!
    【解决方案2】:
    SELECT * FROM your_table ORDER BY score;
    

    您的职位栏似乎是多余的,尽管从问题中提供的信息很难判断。您似乎想要的功能是使用数据库行排序来完成的,在上面的示例中使用“ORDER BY”表达式可以看到。即使您出于某种充分的理由想要一个位置列,请记住,无论如何,分数列很可能存在一个索引,在大多数情况下,这与位置列所做的事情完全相同。要么,要么我完全误解了你的问题。

    【讨论】:

    • 谢谢amn,是的,位置是多余的,但我需要使用它进行优化。位置列将是位置的缓存值,不经常创建。 (每次我希望获得位置时进行排序非常昂贵,例如每 5 分钟设置一次就可以了。)
    • 当您明确告诉它使用以下 SQL 表达式为 score 列建立索引时,数据库系统本身可以更好地完成优化:CREATE INDEX score_index ON your_table(score);
    • 如果你有一个分数作为索引,你不可能优化你的有序分数检索性能,我愿意在我的声明上打赌。尝试对带有位置列的表的查询与我上面写的查询进行基准测试 - 我敢打赌,您不会从带有位置的表中获得任何收益。或者,再一次,我不明白你对这张桌子到底想要什么。
    • 我找到了一个页面,它显示了我的意思。他们使用排名列 oreilly.com/pub/a/mysql/2007/03/01/… 记录了 100* 的性能提升
    • 我可能需要一些时间才能理解文章中提供的信息,但谢谢。
    【解决方案3】:

    用您使用的语言计算它。因此,您的解决方案将是:

    • 更便携
    • 更具可读性
    • 同等效率

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多