[编辑]你可以对 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 秒),如果条件/连接字段被索引会有所帮助。