mysql select rand()运行缓慢

mysql select rand()运行缓慢,mysql,select,random,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']; $i

我有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'];
    }

性能方面的问题是,必须对满足谓词(WHERE子句中的条件)的每一行计算
RAND()
函数。然后,MySQL必须执行“usingfilesort”操作来对行进行排序。(幸运的是,使用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)
该索引将使每月(\month`,a)`的索引
冗余,因此可以删除该索引



你能给我举个例子吗?thx!
在monthly(`month`,a)上创建索引monthly_IX2;
我不太擅长编码,请给我一个完整的查询,thx!StackOverflow不是一个代码编写服务。不要使用
mysql_query
。使用PDO: