为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL:RAND()

MySQL:RAND()

函数式编程 2019-06-18 17:11:50
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
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

此解决方案最好使用索引列.

下面是一个标有100,000行的优化查询工作台的简单示例。

优化:300 ms

SELECT 
    g.*FROM
    table g        JOIN
    (SELECT 
        id    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id

关于极限安装的注意事项*限制4和4/计数(*)。4s必须是相同的号码。改变你返回的次数并不会对速度造成太大的影响。在极限4和极限1000的基准是相同的。最高可达600毫秒

关于联接的注意事项:随机化-仅仅是id-比整行随机化要快。因为它必须将整个行复制到内存中,然后将其随机化。联接可以是链接到子查询ITS的任何表,以防止tablescans。

注哪里条款:WHERE计数限制了随机结果的数量。它获取一个百分比的结果,并对它们进行排序,而不是对整个表进行排序。

注子查询:if do联接和Extern外WHERE子句条件,您需要将它们同时放在子查询和子查询中。有一个准确的计数和提取正确的数据。

联合国国际刑事法庭:1200 ms

SELECT 
    g.*FROM
    table gORDER BY RAND()LIMIT 4

行家

order by rand()..此解决方案可以使用具有索引列的任何表。

反方

对于复杂的查询,它有点复杂。需要在子查询中维护两个代码基


查看完整回答
反对 回复 2019-06-18
?
慕村9548890

TA贡献1884条经验 获得超4个赞

它不是最快的,而是比普通的更快。ORDER BY RAND()途径:

ORDER BY RAND()如果使用它仅查找索引列,则不会太慢。您可以在一个查询中获取所有ID,如下所示:

SELECT idFROM testTableORDER BY RAND();

获得一系列随机ID,并且JOIN具有其他SELECT或WHERE参数的另一个查询的结果:

SELECT t.*FROM testTable tJOIN
    (SELECT id    FROM `testTable`
    ORDER BY RAND()) AS z ON z.id= t.id   
WHERE t.isVisible = 1LIMIT 100;

就你而言,情况是:

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

这是一种非常直截了当的方法,对于很大的桌子来说也不太合适,但是它还是比普通的要快RAND()..我有20倍快的执行时间,搜索近400000中的3000行随机行。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 1199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信