2

我在用

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 以便快速计算?我应该在图片表中添加一个性别列,这样它就不会合并两个表然后得到一个随机行,还是有其他方法来优化 SQL?

4

2 回答 2

3

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

(注意:没有在每个查询中完成计数会减轻负载,否则在这种特殊情况下它可能会更慢,我建议保留您的查询,但要进行索引优化。或者检查一下:Is cross-table indexing可能吗?

[编辑 2]这是另一个使用每个表中平均 50000 个随机条目进行索引优化的示例:http ://sqlfiddle.com/#!2/ bfbe1/1 查询时间不到 100 毫秒(没有索引我让它运行几分钟,仍然没有结果!)。您可以使用CREATE INDEX在现有表上创建索引

这是我使用来自 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 秒),如果条件/连接字段被索引会有所帮助。

于 2012-08-26T10:35:53.850 回答
2

我建议在picture.fbid = user.fbid此创建一个 INDEX 将有助于加快JOIN桌面速度。

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

于 2012-08-26T14:56:37.440 回答