mysql select rand()运行缓慢
我有12个查询在一个页面上运行,每个月一个。他们每个月随机选择一个用户。它跑得很慢,有没有办法加快速度?db有超过500万条记录,而且增长很快。。。。 问题是: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
$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: