优化 MySQL 的 ORDER BY RAND() 性能
优化 MySQL 查询时,可以解决包含 ORDER BY RAND() 函数的慢查询具有挑战性的。本文探讨了增强此类查询性能的有效解决方案。
常见的方法是使用子查询,根据随机值计算每行的排名。这允许有效地选择随机行,而不需要实际排序。
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 值的分布相对均匀。通过利用这些技术,您可以显着优化涉及 ORDER BY RAND() 的 MySQL 查询。
以上是如何优化 MySQL 的 ORDER BY RAND() 以获得更好的性能?的详细内容。更多信息请关注PHP中文网其他相关文章!