我有一个相当低效的mysql查询,直到最近随着数据库规模的增长,它一直工作正常。我正试图使用order by rand()语法选择一个随机记录,但它非常慢(30秒以上),并导致我的php脚本出现问题。有没有更有效的方法来编写这个查询?
SELECT * FROM accountcampaign, accounts WHERE
accountcampaign.status='ACTIVE'
AND accountcampaign.dateLocked IS NULL
AND accountcampaign.campaignID='1'
AND ( (accountcampaign.lockedIPAddress IS NULL)
OR (accountcampaign.lockedIPAddress='')
)
AND ( (accountcampaign.dateLastEntry IS NULL)
OR (DATE(accountcampaign.dateLastEntry) < DATE(NOW()))
)
ORDER BY RAND() LIMIT 1
最佳答案
您不想使用ORDER BY RAND() LIMIT 1
:它将为表中的每一行生成一个随机数。
您应该尝试使用两个查询:
第一个计算表中的行数
然后在php中生成一个介于0和这个计数之间的随机数
然后第二个查询只获取此行
More here
关于mysql - MySQL按rand()排序性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10717016/