我正在使用
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?
答案 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