コードロード

エラー討伐

【SQL】WHERE句は演算子で条件をつけなくても良い

前提

  • テーブル内の全レコード数を取得したかった。
  • idPRIMARY キー
  • 途中で DELETE されてるレコードもあるので id が不連続となっている。
    • そのため、 ORDER BY id DESC LIMIT 1id の値がそのままレコード数というわけにもいかなかった。

概要

今まで WHERE句には id=1 だったり演算子を使って条件を設定しないと使えないと思っていたが、 WHERE id とするだけで使えるようで、非常にクエリが軽くなった。

WHEREありバージョン

実行したSQLとEXPLAINの結果

EXPLAIN
SELECT count(id)
FROM   samples
WHERE  id
array (size=10)
      'id' => int 1
      'select_type' =>  'SIMPLE'
      'table' => 'samples'
      'type' => 'range'
      'possible_keys' => 'PRIMARY'
      'key' => 'PRIMARY'
      'key_len' => '8'
      'ref' => null
      'rows' => 5852957
      'Extra' => 'Using where; Using index'

WHEREなしバージョン

実行したSQLとEXPLAINの結果

EXPLAIN
SELECT count(id)
FROM   samples
array (size=10)
      'id' => 1
      'select_type' => 'SIMPLE'
      'table' => 'samples'
      'type' => 'index'
      'possible_keys' => null
      'key' => 'samples_index'
      'key_len' => '161'
      'ref' => null
      'rows' => 11705913
      'Extra' => 'Using index'

参考

EXPLAINについて

漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!