【问题标题】:SQL Performance - SELECT COUNT vs SELECT id with LIMIT 1SQL 性能 - SELECT COUNT vs SELECT id with LIMIT 1
【发布时间】:2016-11-03 06:36:32
【问题描述】:

有一个带有innodb的mysql数据库,我想找到最快的方法来检查一行是否存在。

所以是不是更快:

    $sql5 = "SELECT id, value FROM pc_taxes WHERE id = :taxId AND client_id = :clientID LIMIT 1";
            $stmt5 = getaccessdata::getInstance()->prepare($sql5);
            $stmt5->bindValue(':clientID', $client_id, PDO::PARAM_INT);
            $stmt5->bindValue(':taxId', $taxID, PDO::PARAM_INT);

            try {
                $stmt5->execute();
                $req5 = $stmt5->fetchAll(PDO::FETCH_ASSOC);
                $countTaxVal = 0;
                foreach ($req5 as $r5) {
                    $countTaxVal++;
                }
            } catch (Exception $e) {

            }

if($countTaxVal>0){
$rowExist=true;
}

或者这个版本在非常大的记录上更快:

$sql5 = "SELECT COUNT(*) FROM pc_taxes WHERE id = :taxId AND client_id = :clientID LIMIT 1";
            $stmt5 = getaccessdata::getInstance()->prepare($sql5);
            $stmt5->bindValue(':clientID', $client_id, PDO::PARAM_INT);
            $stmt5->bindValue(':taxId', $taxID, PDO::PARAM_INT);

numRows =0;
            try {
                $stmt5->execute();
                $numRows = $stmt5->fetchColumn();


            } catch (Exception $e) {

            }

if($numRows >0){
$rowExist=true;
}

感谢您的建议。

【问题讨论】:

  • 我已经搜索过,但从未找到 LIMIT 1 的 SELECT COUNT...
  • 用限制计数真的没有意义......
  • 如果找到一行,它会停止计数吗?所以它计算所有记录并且只输出一个?

标签: php mysql sql pdo innodb


【解决方案1】:

这并不重要。

请不要突然提出与性能相关的问题。相反,只有在遇到问题时才考虑解决方案。

对于您提出的问题,检查行是否存在的最快方法是为查询中涉及的列建立索引。这是正确的答案,这是您完成任务所需的一切。虽然特定的 SQL 语法并不重要。

因此,对于您的问题,您需要像这样的索引id_client(id,client_id)

-- 这就是让您的查询更快的原因。

出于常识,我会说如果您不需要计数而只想要一个标志,那么选择那个标志:

$sql = "SELECT 1 FROM pc_taxes WHERE id = ? AND client_id = ? LIMIT 1";
$stmt = getaccessdata::getInstance()->prepare($sql);
$stmt->execute([$client_id,$taxID]);
$rowExist = $stmt->fetchColumn();

看在上帝的份上,不要将您的查询包装到空的 try catch 中。你会深深地后悔你开始这样做的那一天。

【讨论】:

  • id 是primary_key 所以另外我应该给client_id 添加一个索引?对于“天哪”部分,您的意思是我应该处理异常?
  • 如果它是主键,那么你不需要额外的索引。而且你也不需要 LIMIT 。至于例外,请不要理会它们。不要抓住,不要“处理”。让他们走吧:phpdelusions.net/pdo#errors
  • 感谢您的建议。真的很有帮助。在您的示例中,如果 $rowExist = 0 该行将不存在,如果 $rowExist=1 它将存在,对吗?
  • 是的。你可以直接在条件中使用,比如if ($rowExist) ... - PHP 会理解的
猜你喜欢
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 2013-08-19
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多