我有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'];
}
答案 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)'冗余,以便可以删除索引。