优化 MySQL 的 ORDER BY RAND() 函数以加快随机行选择
MySQL 的 ORDER BY RAND() 函数广泛用于选择随机行表中的行。但是,它可能效率低下,特别是对于大型表或频繁更新。这种低效率在慢速查询日志中很明显,其中包含 ORDER BY RAND() 的查询会显着降低速度。
一种潜在的解决方案是 MySQLPerformanceBlog 的方法,该方法涉及将查询拆分为多个子查询。然而,这种技术可能并不适合所有情况。
替代方法
下面显示了一种可提高效率的替代方法:
SELECT * FROM ( SELECT @cnt := COUNT(*) + 1, @lim := 10 FROM t_random ) vars STRAIGHT_JOIN ( SELECT r.*, @lim := @lim - 1 FROM t_random r WHERE (@cnt := @cnt - 1) AND RAND(20090301) < @lim / @cnt ) i
该方法通过计算基于两个变量选择的每一行的运行概率来进行操作。通过使用 STRAIGHT_JOIN,结果中的行顺序被保留,有效地提供了随机选择。
特定情况:选择单个随机记录
如果要求是要选择单个随机记录,可以使用以下查询:
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 ) q2 JOIN accomodation aco ON 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 值。
通过采用这些替代方法,您可以显着提高涉及 ORDER BY RAND() 函数的 MySQL 查询的性能。
以上是如何优化 MySQL 的 ORDER BY RAND() 函数以加快随机行选择速度?的详细内容。更多信息请关注PHP中文网其他相关文章!