所以我有一个相当大的查询,搜索了6k成员和3k网站,这用于在网站启动时很好,但现在网站变得越来越大,这个查询已开始滞后只是寻找有关如何的建议我可以加快速度
$stmt212 = $db->prepare('SELECT *
FROM websites w
LEFT JOIN users u ON u.username = w.owner
WHERE u.coins >= ?
ORDER BY RAND()
LIMIT 1');
$stmt212->execute( array('1') ) ;
$row212 = $stmt212->fetch();
用户在我的网站上有“硬币”和他们赚钱的项目,然后有项目被查看,所以我上面做的是抓住一个硬币超过1的用户,谁有一个项目
答案 0 :(得分:0)
正如大多数评论中所述,在查询中使用RAND()
可能是件坏事。我假设两列都没有编入索引,这使得数据库驱动程序非常困难。
为了保持数据库结构并保持性能,您可以让PHP为您随机化索引:
$stmt = $db->prepare('
SELECT *
FROM websites w
LEFT JOIN users u ON u.username = w.owner
WHERE u.coins >= ?
');
$stmt->execute(array('1')); // why are you not checking if this succeeds?
$result = $stmt->fetchAll(PDO::FETCH_NUM);
$result = array_rand($result);
print_r($result);
答案 1 :(得分:0)
您需要处理两个查询而不是一个查询。
获取符合条件的记录数
$stmt212count = $db->prepare("
SELECT
count(*)
FROM
websites w
INNER JOIN
users u ON
u.username = w.owner
AND u.coins >= :coins
");
$stmt212count->bindValue('coins', 1, PDO::PARAM_INT);
$stmt212count->execute();
$row212count = $stmt212count->fetch(PDO::FETCH_COLUMN);
选择随机行
# random row offset
$offset = rand(0, $row212count-1);
如果你有PDO模拟准备打开
,请使用此语句
$stmt212 = $db->prepare(sprintf(
"
SELECT
*
FROM
websites w
INNER JOIN
users u ON
u.username = w.owner
AND u.coins >= :coins
LIMIT %d,1
",
$offset
);
$stmt212count->bindValue('offset', $offset, PDO::PARAM_INT);
如果您没有使用PDO模拟准备
,请使用此选项
$stmt212 = $db->prepare("
SELECT
*
FROM
websites w
INNER JOIN
users u ON
u.username = w.owner
AND u.coins >= :coins
LIMIT :offset,1
");
将这个用于两个陈述
$stmt212count->bindValue('coins', 1, PDO::PARAM_INT);
$stmt212count->execute();
$row212 = $stmt212->fetch();