SQL优化得到随机Row

时间:2012-08-26 10:13:33

标签: mysql

我正在使用

SELECT * 
  FROM picture 
 INNER JOIN user ON picture.fbid = user.fbid 
 WHERE hide = 0 
   AND userhide = 0 
 ORDER BY gender, RAND( ) LIMIT 0 , 1

这会执行并向我提供指向性别为女性的随机行图片的链接。执行大约需要15秒。

我怎样才能更改SQL以便快速计算?我应该在Picture表中添加一个性别列,以便它不会同时组合表然后得到一个随机行,还是有其他方法来优化SQL?

2 个答案:

答案 0 :(得分:3)

[编辑] 你可以对MySQL存储过程做同样的事情,我只是在这里编写代码:http://sqlfiddle.com/#!2/d0e6a/2

(注意:没有在每个查询中完成计数会使负载相加,否则在这种特殊情况下它可能会更慢,我建议保留您的查询,但是使用索引优化。或者检查出来:{{ 3}})

[编辑2] 以下是使用每个表中平均50000个随机条目进行索引优化的另一个示例:Is cross-table indexing possible?查询花费不到100毫秒(没有索引我让它运行几分钟仍然没有结果!)。您可以使用http://sqlfiddle.com/#!2/bfbe1/1

在现有表上创建索引

这是我使用PHP脚本中的2个查询的解决方案:

$sql="SELECT COUNT(*) 
  FROM picture 
 INNER JOIN user ON picture.fbid = user.fbid 
 WHERE hide = 0 
   AND userhide = 0
   AND gender = 'female' 
   GROUP BY gender";

$result=mysql_query($sql);
$row=mysql_fetch_array($result);

$sql="SELECT * 
      FROM picture 
      INNER JOIN user ON picture.fbid = user.fbid 
      WHERE hide = 0 
      AND userhide = 0
      AND gender = 'female' 
      LIMIT FLOOR(RAND()*$row['COUNT(*)']),1";

$result=mysql_query($sql);
$picture=mysql_fetch_array($result);

这可以让你更快地查询。

另外,如果你的表很大(我猜是这种情况,因为查询需要15秒),如果条件/连接字段被索引,这将有所帮助。

答案 1 :(得分:2)

我建议在picture.fbid = user.fbid上创建一个INDEX,这有助于加快桌面上的JOIN

更多Mysql特定信息:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html