PHP查询滞后服务器

时间:2017-02-19 01:12:48

标签: 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->execute( array('1') ) ;
$row212 = $stmt212->fetch();

用户在我的网站上有“硬币”和他们赚钱的项目,然后有项目被查看,所以我上面做的是抓住一个硬币超过1的用户,谁有一个项目

2 个答案:

答案 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();