我有一个相当低效的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/

10-11 09:04