如何增强 MySQL 的 ORDER BY RAND() 性能
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
该技术在 MyISAM 数据库中非常高效,并且在 InnoDB 中也提供了显着的性能改进。
选择单个随机记录
对于涉及选择单个随机记录的场景,请考虑以下内容查询:
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 值均匀分布。
以上是如何提高 MySQL 对大型数据集的 ORDER BY RAND() 性能?的详细内容。更多信息请关注PHP中文网其他相关文章!