2016-11-03 8 views
0

с базой данных mysql с innodb, и я хочу найти самый быстрый способ проверить, существует ли строка.SQL Performance - SELECT COUNT vs SELECT id с LIMIT 1

Так это быстрее сделать:

$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

Я уже искал, но не нашел SELECT COUNT с LIMIT 1 ... –

+1

count с лимитом на самом деле не имеет смысла ... –

+0

Думал, что прекратится отсчет, если будет найден один ряд? Таким образом, он учитывает все записи и выводит только один? –

ответ

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

И ради бога, не обернуть ваши запросы в пустую попытку поймать. Вы будете глубоко сожалеть о том, что вы начали это делать.

+0

id - primary_key, поэтому я должен добавить индекс к client_id? С частью «благости ради» вы подразумеваете, что я должен обработать исключение? –

+0

Если это первичный ключ, то вам не нужен дополнительный индекс. а также вам не нужен LIMIT. Что касается исключений, просто оставьте их в покое. Не поймайте, не «ручка». Просто отпустите их: https://phpdelusions.net/pdo#errors –

+0

Спасибо за советы. Действительно полезно. В вашем примере, если $ rowExist = 0, строка не будет существовать, и если $ rowExist = 1 она будет существовать, я прав? –