草庐IT

php - 好主意/坏主意?在一小组子查询结果之外使用 MySQL RAND()?

coder 2023-10-08 原文

所以在 MySQL 中,我已经读到对于有很多行的大表,使用 ORDER BY RAND() 是一个坏主意(即使有大约 500 行表,据说)。缓慢且低效。大量行扫描。

这个(下图)看起来如何作为替代方案?

SELECT * FROM(...通常返回少于 20 行的集合的子查询...)ORDER BY RAND() LIMIT 8

我不会对大量数据使用 RAND(),而是选择一个小的子集,然后才对那些返回的行应用 RAND()。在 99.9% 的情况下,上面看到的子查询应该选择少于 20 行(事实上,通常少于 8 行)。

很想听听人们的想法。

(仅供引用,我正在用 PHP 处理 MySQL。)

谢谢!

最佳答案

实际上...我最终运行了一个测试,我可能已经回答了我自己的问题。我想我会在这里发布这些信息,以防它对其他人有用。 (如果我在这里做错了什么,请告诉我!)

这有点令人惊讶......

与我读过的所有内容相反,我创建了一个名为 TestData 的表,其中包含 100 万行并运行了以下查询:

SELECT * FROM TestData WHERE number = 41 ORDER BY RAND() LIMIT 8

...它返回行的平均时间为 0.0070 秒。我真的不明白为什么 RAND() 的名声这么差。它对我来说似乎很有用,至少在这种特殊情况下是这样。

我的表中有三列:

id [BIGINT(20)] |文本字段 [tinytext] |数字 [BIGINT(20)]

id 上的主键,number 上的索引。

我想 MySQL 足够聪明,知道它应该只将 RAND() 应用于“WHERE number = 41”返回的 20 行? (我特意只添加了 20 行,“数字”的值为 41。)

备用子查询方法返回结果的平均时间约为 0.0080 秒,比非子查询方法慢。

子查询方法:SELECT * FROM (SELECT * FROM TestData WHERE number = 41) as t ORDER BY RAND() LIMIT 8

关于php - 好主意/坏主意?在一小组子查询结果之外使用 MySQL RAND()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4710048/

有关php - 好主意/坏主意?在一小组子查询结果之外使用 MySQL RAND()?的更多相关文章

  1. 通过 MacPorts 的 RubyGems 是个好主意吗? - 2

    从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装ruby​​gems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf

  2. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

  3. ruby - 为什么允许在 Ruby 类之外定义全局方法? - 2

    我读过这个:Let’sstartwithasimpleRubyprogram.We’llwriteamethodthatreturnsacheery,personalizedgreeting.defsay_goodnight(name)result="Goodnight,"+namereturnresultend我的理解是,方法是定义在类中的函数或子程序,可以关联到类(类方法)或对象(实例方法)。那么,如果它不是在类中定义的,怎么可能是方法呢? 最佳答案 当你在Ruby中以这种方式在全局范围内定义一个函数时,它在技术上变成了Obje

  4. Ruby 服务器在本地主机(teambox)之外非常慢 - 2

    我刚刚在我的Ubuntu9.10服务器上安装了TeamBox。我使用提供的服务器脚本在端口3000上启动并运行它。它的运行速度非常慢,从另一台计算机连接时每个HTTP请求最多需要30秒。我使用链接从shell加载TeamBox,一点也不花时间。然后我设置了一个SSH隧道,它再次运行得非常快。我通过此服务器上的apache以及SAMBA等运行了大约30个虚拟主机,没有任何问题。我该如何解决这个问题? 最佳答案 我的redmine(ruby,webrick)太慢了。现在我解决了这个问题:apt-getinstallmongrelruby

  5. arrays - 在一行中选择数组的第一个和最后一个元素 - 2

    我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,

  6. ruby-on-rails - 当需要 active_support 时,cattr_accessor 不工作(在 rails 之外)? - 2

    我不熟悉active_support,所以请多多包涵!Fox'slibrary允许通过谷歌的API进行搜索,但它需要积极的支持。我似乎无法让它工作!有什么想法吗?require'rubygems'require'active_support'require'google_search'pGoogleSearch.web:q=>"HelloWorld!"给我:NoMethodError:undefinedmethod‘cattr_accessor’forGoogleSearch:Class知道我做错了什么吗? 最佳答案 通过更多的谷歌

  7. ruby - 在一个进程多个数据库连接 sinatra 应用程序中使用什么 ORM? - 2

    已检查ActiveRecord、DataMapper、Sequel:有些使用全局变量(静态变量)有些需要在使用模型加载源文件之前打开数据库连接。在使用不同数据库的sinatra应用程序中使用哪种ORM更好。 最佳答案 DataMapper专为多数据库使用而设计。你可以通过像DataMapper.setup(:repository_one,"mysql://localhost/my_db_name")这样的方式设置多个存储库。DataMapper随后会跟踪所有已在哈希中设置的存储库,您可以引用该哈希并将其用于范围界定:DataMapp

  8. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  9. ruby-on-rails - 您如何找到一天在一个月中的星期几? - 2

    我似乎无法理解这个可能很简单的问题..假设我有日期..Fri,14Sep201218:37:50+0200我如何找出这个月的这个日期是星期几?是第一个,第二个..?第三个?谢谢! 最佳答案 为什么要使用图书馆?Ruby默认有它:Weeknumber:Theweek1ofYYYYstartswithaSundayorMonday(accordingto%Uor%W).Thedaysintheyearbeforethefirstweekareinweek0.%U-Weeknumberoftheyear.Theweekstartswith

  10. Ruby,我如何访问 do - end 循环之外的局部变量 - 2

    我有一个循环,我在远程机器上执行一系列命令:ssh.exec('cd/vmfs/volumes/4c6d95d2-b1923d5d-4dd7-f4ce46baaadc/ghettoVCB;./ghettoVCB.sh-fvms_to_backup-ddryrun')do|ch,stream,data|if#{stream}=~/vmupgrade/putsvalue_hosts+"is"+dataputs#{stream}putsdataendend我想在do-end循环之外访问#{stream}和数据如果有任何帮助,我将不胜感激。谢谢,嗨,约格,我实现了您的建议,但现在出现错误:Wr

随机推荐