我想优化我的查询,所以我调查一下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中的大表中快速选择随机行
我已经看到使用这样的查询拉取随机行,这对于大型数据集来说效率很低.
SELECT id FROM table ORDER BY RANDOM() LIMIT 1
Run Code Online (Sandbox Code Playgroud)
我还看到了其他各种与MySQL无关的RDBMS特定解决方案.
我能想到的最好的事情就是使用两个查询并执行类似的操作.
这是SQL:
SELECT COUNT(*) FROM table;
SELECT id FROM table LIMIT randnum, 1;
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的主意?
我目前有一个查询结束,ORDER BY RAND(HOUR(NOW())) LIMIT 40以获得40个随机结果.结果列表每小时更改一次.
这会终止查询缓存,这会破坏性能.
你能否建议另一种方法来获得随时变化的随机(ish)结果集?它不一定是每个小时,也不一定是完全随机的.
我更喜欢随机结果,而不是在表格中的任意字段上排序,但我会这样做作为最后的手段......
(这是我想要随时改变的新产品列表).