Php查询服务器

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

因此,我有一个相当大的查询,虽然搜索了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并且拥有项目的用户,正如大多数评论中所述,在查询中使用
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();