2016-11-03 14 views
0

mysqlデータベースとinnodbを持つので、行が存在するかどうかを確認する最速の方法を探したいと思う。このバージョンより速く、非常に大きな記録に関するSQLパフォーマンス - SELECT COUNT対LIMIT 1のSELECT ID

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

感謝。

+0

私はすでに検索しましたが、LIMIT 1 ... –

+1

の制限付きカウントは実際には意味がありません... –

+0

1つの行が見つかるとカウントが停止すると思っていましたか?したがって、すべてのレコードを数え、1つだけを出力しますか? –

答えて

0

本当に問題ではありません。

パフォーマンス関連の質問はどこにも出さないでください。代わりに、あなたが手元に問題がある場合にのみ、ソリューションに気をつけてください。

質問があった場合、行が存在するかどうかを確認する最速の方法は、というクエリのインデックスを持つです。これは正解です。これはあなたがタスクに必要なすべてです。特定の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に移動します。あなたがその日を始めたのは深く残念です。

+0

idがprimary_keyなので、さらにclient_idにインデックスを追加する必要がありますか? 「優しさ」の部分は、例外を処理する必要があるということですか? –

+0

主キーの場合、追加の索引は必要ありません。 LIMITも必要ありません。例外として、ただそれらを残してください。つかまえてはいけません。ちょうどそれらを行こう:https://phpdelusions.net/pdo#errors –

+0

アドバイスをありがとう。本当に役に立ちました。あなたの例では、$ rowExist = 0の場合は行は存在しません。$ rowExist = 1の場合は存在しますが、そうですか? –