MySQL:添加一个position列

MySQL:添加一个position列,mysql,optimization,Mysql,Optimization,给出一张表格: id | score | position ===================== 1 | 20 | 2 2 | 10 | 3 3 | 30 | 1 我可以使用什么查询来使用(不可为空)分数列优化设置位置列 (我肯定我以前见过这个,但我似乎无法找到正确的关键字!) 一下子更新位置就可以了。分数相等,地位相等 一下子更新位置就可以了。相等的分数得到相等的位置用你正在使用的语言计算它。因此,您的解决方案将是:

给出一张表格:

id | score | position
=====================
 1 |    20 |        2
 2 |    10 |        3
 3 |    30 |        1
我可以使用什么查询来使用(不可为空)分数列优化设置位置列

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

一下子更新位置就可以了。分数相等,地位相等


一下子更新位置就可以了。相等的分数得到相等的位置

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

  • 更便携
  • 可读性更强
  • 等效有效

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

  • 更便携
  • 可读性更强
  • 等效有效
你的职位栏似乎是多余的,尽管从问题中给出的信息很难判断。您似乎想要的功能是通过使用数据库行排序来实现的,如上例中的“orderby”表达式所示。即使你出于某种原因想要一个职位栏,也要记住,分数栏很可能存在一个索引,在大多数情况下,这与职位栏做的事情完全相同。要么这样,要么我完全误解了你的问题


你的职位栏似乎是多余的,尽管从问题中给出的信息很难判断。您似乎想要的功能是通过使用数据库行排序来实现的,如上例中的“orderby”表达式所示。即使你出于某种原因想要一个职位栏,也要记住,分数栏很可能存在一个索引,在大多数情况下,这与职位栏做的事情完全相同。要么是这样,要么我完全误解了你的问题。

谢谢,但我正在寻找类似的解决方案:我试图暗示为什么这样的解决方案不那么可取:)谢谢,但我正在寻找类似的解决方案:我试图暗示为什么这样的解决方案不那么可取:)谢谢,是的,位置是多余的,但我需要使用它进行优化。Position列将是Position的缓存值,很少创建。(每次我希望获得位置时进行排序非常昂贵,例如每5分钟设置一次就可以了。)当您使用以下SQL表达式显式告诉数据库系统为分数列编制索引时,数据库系统本身可以更好地完成优化:在您的_表(score)上创建索引分数_索引;如果你有一个分数作为索引,你不可能优化你的有序分数检索性能,我愿意打赌我的声明。尝试将您对带有位置列的表的查询与我在上面编写的查询进行基准测试-我打赌您将不会从带有位置的表中获得任何好处。或者,再一次,我不明白你到底想要这个表做什么。我找到了一个页面,显示了我的意思。他们使用排名列记录了100*的性能提升,我可能需要一段时间才能了解文章中提供的信息,但谢谢。谢谢amn,是的,职位是多余的,但我需要使用它进行优化。Position列将是Position的缓存值,很少创建。(每次我希望获得位置时进行排序非常昂贵,例如每5分钟设置一次就可以了。)当您使用以下SQL表达式显式告诉数据库系统为分数列编制索引时,数据库系统本身可以更好地完成优化:在您的_表(score)上创建索引分数_索引;如果你有一个分数作为索引,你不可能优化你的有序分数检索性能,我愿意打赌我的声明。尝试将您对带有位置列的表的查询与我在上面编写的查询进行基准测试-我打赌您将不会从带有位置的表中获得任何好处。或者,再一次,我不明白你到底想要这个表做什么。我找到了一个页面,显示了我的意思。他们使用排名列记录了100*的性能提升,我可能需要一段时间才能了解文章中提供的信息,但是谢谢。啊,谢谢,看起来是这样的,
rank
是我应该早些时候使用的关键词!啊,谢谢,看起来是这样的,
rank
是我应该早点用的关键词!
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;
SELECT * FROM your_table ORDER BY score;