相关疑难解决方法(0)

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

我想优化我的查询,所以我调查一下mysql-slow.log.

我的大多数慢查询包含ORDER BY RAND().我无法找到解决此问题的真正解决方案.Theres是MySQLPerformanceBlog的可能解决方案,但我认为这还不够.在未经优化(或经常更新,用户管理)的表上,它不起作用,或者我需要运行两个或更多查询才能选择我PHP生成的随机行.

这个问题有什么解决方案吗?

一个虚拟的例子:

SELECT  accomodation.ac_id,
        accomodation.ac_status,
        accomodation.ac_name,
        accomodation.ac_status,
        accomodation.ac_images
FROM    accomodation, accomodation_category
WHERE   accomodation.ac_status != 'draft'
        AND accomodation.ac_category = accomodation_category.acat_id
        AND accomodation_category.acat_slug != 'vendeglatohely'
        AND ac_images != 'b:0;'
ORDER BY
        RAND()
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

mysql random performance

88
推荐指数
2
解决办法
6万
查看次数

从MySQL中的表中选择随机行的最佳方法是什么?

可能重复:
从mysql中的大表中快速选择随机行

我已经看到使用这样的查询拉取随机行,这对于大型数据集来说效率很低.

SELECT id FROM table ORDER BY RANDOM() LIMIT 1
Run Code Online (Sandbox Code Playgroud)

我还看到了其他各种与MySQL无关的RDBMS特定解决方案.

我能想到的最好的事情就是使用两个查询并执行类似的操作.

  1. 获取表中的行数.MyISAM表存储行数,因此速度非常快.
  2. 计算0和rowcount - 1之间的随机数.
  3. 选择按主键排序的行,使用LIMIT randnum,1

这是SQL:

SELECT COUNT(*) FROM table;
SELECT id FROM table LIMIT randnum, 1;
Run Code Online (Sandbox Code Playgroud)

有没有人有更好的主意?

mysql random

9
推荐指数
0
解决办法
1873
查看次数

ORDER BY RAND()替代方案

可能重复:
MySQL:ORDER BY RAND的替代品()

我目前有一个查询结束,ORDER BY RAND(HOUR(NOW())) LIMIT 40以获得40个随机结果.结果列表每小时更改一次.

这会终止查询缓存,这会破坏性能.

你能否建议另一种方法来获得随时变化的随机(ish)结果集?它不一定是每个小时,也不一定是完全随机的.

我更喜欢随机结果,而不是在表格中的任意字段上排序,但我会这样做作为最后的手段......

(这是我想要随时改变的新产品列表).

mysql random performance

7
推荐指数
3
解决办法
5119
查看次数

标签 统计

mysql ×3

random ×3

performance ×2