SQL性能 - 使用LIMIT 1 SELECT COUNT与SELECT id

时间:2016-11-03 06:36:33

标签: php mysql sql pdo innodb

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

这样做更快:

$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;
}

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

git remote set-url --push private <your-repo-url>

感谢您的建议。

1 个答案:

答案 0 :(得分: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中。你会开始这样做,你会深感遗憾。