猿问

MySQL:RAND()

MySQL:RAND()

我读到了MySQL的一些替代方案ORDER BY RAND()函数,但大多数选择只适用于需要对单个随机结果进行处理的地方。

是否有人知道如何优化返回多个随机结果的查询,如:

   SELECT u.id, 
          p.photo 
     FROM users u, profiles p 
    WHERE p.memberid = u.id 
      AND p.photo != '' 
      AND (u.ownership=1 OR u.stamp=1) 
 ORDER BY RAND() 
    LIMIT 18


函数式编程
浏览 1200回答 3
3回答

撒科打诨

此解决方案最好使用索引列.下面是一个标有100,000行的优化查询工作台的简单示例。优化:300 msSELECT&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;g.*FROM &nbsp;&nbsp;&nbsp;&nbsp;table&nbsp;g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOIN &nbsp;&nbsp;&nbsp;&nbsp;(SELECT&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;FROM &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table &nbsp;&nbsp;&nbsp;&nbsp;WHERE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RAND()&nbsp;<&nbsp;(SELECT&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((4&nbsp;/&nbsp;COUNT(*))&nbsp;*&nbsp;10) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table) &nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;RAND() &nbsp;&nbsp;&nbsp;&nbsp;LIMIT&nbsp;4)&nbsp;AS&nbsp;z&nbsp;ON&nbsp;z.id=&nbsp;g.id关于极限安装的注意事项*限制4和4/计数(*)。4s必须是相同的号码。改变你返回的次数并不会对速度造成太大的影响。在极限4和极限1000的基准是相同的。最高可达600毫秒关于联接的注意事项:随机化-仅仅是id-比整行随机化要快。因为它必须将整个行复制到内存中,然后将其随机化。联接可以是链接到子查询ITS的任何表,以防止tablescans。注哪里条款:WHERE计数限制了随机结果的数量。它获取一个百分比的结果,并对它们进行排序,而不是对整个表进行排序。注子查询:if do联接和Extern外WHERE子句条件,您需要将它们同时放在子查询和子查询中。有一个准确的计数和提取正确的数据。联合国国际刑事法庭:1200 msSELECT&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;g.*FROM &nbsp;&nbsp;&nbsp;&nbsp;table&nbsp;gORDER&nbsp;BY&nbsp;RAND()LIMIT&nbsp;4行家比order by rand()..此解决方案可以使用具有索引列的任何表。反方对于复杂的查询,它有点复杂。需要在子查询中维护两个代码基

慕村9548890

它不是最快的,而是比普通的更快。ORDER BY RAND()途径:ORDER BY RAND()如果使用它仅查找索引列,则不会太慢。您可以在一个查询中获取所有ID,如下所示:SELECT&nbsp;idFROM&nbsp;testTableORDER&nbsp;BY&nbsp;RAND();获得一系列随机ID,并且JOIN具有其他SELECT或WHERE参数的另一个查询的结果:SELECT&nbsp;t.*FROM&nbsp;testTable&nbsp;tJOIN &nbsp;&nbsp;&nbsp;&nbsp;(SELECT&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;`testTable` &nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;RAND())&nbsp;AS&nbsp;z&nbsp;ON&nbsp;z.id=&nbsp;t.id&nbsp;&nbsp;&nbsp; WHERE&nbsp;t.isVisible&nbsp;=&nbsp;1LIMIT&nbsp;100;就你而言,情况是:SELECT&nbsp;u.id,&nbsp;p.photo&nbsp; FROM&nbsp;users&nbsp;u,&nbsp;profiles&nbsp;p&nbsp; JOIN &nbsp;&nbsp;&nbsp;&nbsp;(SELECT&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;users&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;RAND())&nbsp;AS&nbsp;z&nbsp;ON&nbsp;z.id&nbsp;=&nbsp;u.id&nbsp;&nbsp;&nbsp; WHERE&nbsp;p.memberid&nbsp;=&nbsp;u.id&nbsp; &nbsp;&nbsp;AND&nbsp;p.photo&nbsp;!=&nbsp;''&nbsp; &nbsp;&nbsp;AND&nbsp;(u.ownership=1&nbsp;OR&nbsp;u.stamp=1)&nbsp;LIMIT&nbsp;18这是一种非常直截了当的方法,对于很大的桌子来说也不太合适,但是它还是比普通的要快RAND()..我有20倍快的执行时间,搜索近400000中的3000行随机行。
随时随地看视频慕课网APP
我要回答