栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

我如何优化MySQL的ORDER BY RAND()函数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我如何优化MySQL的ORDER BY RAND()函数?

尝试这个:

SELECt  *FROM    (        SELECt  @cnt := COUNT(*) + 1,     @lim := 10        FROM    t_random        ) varsSTRAIGHT_JOIN        (        SELECt  r.*,     @lim := @lim - 1        FROM    t_random r        WHERe   (@cnt := @cnt - 1)     AND RAND(20090301) < @lim / @cnt        ) i

MyISAM
(由于
COUNT(*)
是即时的),此方法特别有效,但即使这样,
InnoDB
10
效率也比更高
ORDER BY RAND()

这里的主要思想是我们不进行排序,而是保留两个变量并计算

running probability
要在当前步骤中选择的行的。

有关更多详细信息,请参见我的博客中的这篇文章:

  • 选择随机行

更新:

如果您只需要选择一条随机记录,请尝试以下操作:

SELECt  aco.*FROM    (        SELECt  minid + FLOOR((maxid - minid) * RAND()) AS randid        FROM    (     SELECt  MAX(ac_id) AS maxid, MIN(ac_id) AS minid     FROM    accomodation     ) q        ) q2JOIN    accomodation acoON      aco.ac_id =        COALESCE        (        (        SELECt  accomodation.ac_id        FROM    accomodation        WHERe   ac_id > randid     AND ac_status != 'draft'     AND ac_images != 'b:0;'     AND NOT EXISTS     (     SELECt  NULL     FROM    accomodation_category     WHERe   acat_id = ac_category  AND acat_slug = 'vendeglatohely'     )        ORDER BY     ac_id        LIMIT   1        ),        (        SELECt  accomodation.ac_id        FROM    accomodation        WHERe   ac_status != 'draft'     AND ac_images != 'b:0;'     AND NOT EXISTS     (     SELECt  NULL     FROM    accomodation_category     WHERe   acat_id = ac_category  AND acat_slug = 'vendeglatohely'     )        ORDER BY     ac_id        LIMIT   1        )        )

假设您

ac_id
的或多或少均匀分布。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/367723.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号