Php查询服务器
因此,我有一个相当大的查询,虽然搜索了6k会员和3k网站,这是很好的网站启动,但现在该网站是越来越大的网页,这一查询已经开始滞后,只是寻找建议,我可以如何加快它Php查询服务器,php,Php,因此,我有一个相当大的查询,虽然搜索了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->execu
$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并且拥有项目的用户,正如大多数评论中所述,在查询中使用
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);
正如大多数注释所述,在查询中使用
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);
您将需要处理两个查询,而不是一个查询 获取符合条件的记录数 随机选取一行 如果已启用PDO模拟准备,请使用此语句 如果您没有使用PDO仿真系统,请使用此选项 这两个语句都使用
您将需要处理两个查询,而不是一个查询 获取符合条件的记录数 随机选取一行 如果已启用PDO模拟准备,请使用此语句 如果您没有使用PDO仿真系统,请使用此选项 这两个语句都使用
u.username、w.owner和u.coins都被索引了吗^lol甚至没有看到,order by rand可能是性能死亡的副本,所以我就把order by rand拿出来了?u.username、w.owner和u.coins都被索引了吗^lol甚至没有看到,order by rand可能是性能死亡的副本,所以我就把order by rand拿出来了?
# random row offset
$offset = rand(0, $row212count-1);
$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);
$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();