SQL 性能 - SELECT COUNT 对比 SELECT id,LIMIT 1

SQL Performance - SELECT COUNT vs SELECT id with LIMIT 1

有一个带有 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;
}

感谢您的建议。

没关系。

请不要无缘无故地问与性能相关的问题。相反,只有在手头有问题时才需要解决方案。

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

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

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

出于常识我会说,如果你不需要 count 但只想要一个标志,那么 select 那个标志:

$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 中。你会深深后悔那天你开始这样做。