mysql选择rand()运行缓慢

时间:2016-02-01 22:19:00

标签: mysql select random

我有12个查询在一个页面中运行,每个月一个。他们每个月选择一个随机用户。它运行得很慢,有没有办法加快速度? db拥有超过500万条记录,而且它正在快速增长.... 这是查询:

$result = mysql_query('SELECT * FROM monthly where month = "jan" and a="0" ORDER BY RAND() LIMIT 0,1;');

while($row = mysql_fetch_array($result))
{
$id = $row['id'];
$ip = $row['ip'];
$title = $row['tile'];
$user = $row['user'];
$email = $row['email'];
$phone = $row['phone'];
    }

    .
    .
    .
    .
    .
$result = mysql_query('SELECT * FROM monthly where month = "dec" and a="0" ORDER BY RAND() LIMIT 0,1;');

while($row = mysql_fetch_array($result))
{
$id = $row['id'];
$ip = $row['ip'];
$title = $row['tile'];
$user = $row['user'];
$email = $row['email'];
$phone = $row['phone'];
    }

1 个答案:

答案 0 :(得分:0)

性能问题是必须为满足谓词的每个行评估RAND()函数(WHERE子句中的条件。)然后MySQL必须执行“使用” filesort“命令行的操作。 (幸运的是,使用LIMIT子句,MySQL不应该对所有行进行排序;它实际上只需要找到最低值。

根据给定的查询,在编写时,您可以做的就是通过确保适当的索引可用来优化对行的访问。

... ON monthly (`month`,a)

如果您调整查询以仅返回您需要返回的列,并且这是该行中列的一小部分...替换*

SELECT m.id
     , m.ip
     , m.tile
     , m.user
     , m.email
     , m.phone
  FROM monthly m 
 WHERE m.month = 'jan'
   AND m.a = '0'  

然后添加覆盖索引:

 ... ON monthly (`month`,a,id,ip,tile,user,email,phone)

此索引会使索引ON monthly (\ month`,a)'冗余,以便可以删除索引。