背景
プロジェクト内で、レコードの存在チェックをする際
以下のようにWHERE句でUKまたはPKが指定されている場合、末尾にLIMIT句を設けるべきか否かが話題に上がった。
指定ユーザーの存在チェック
SELECT
1
FROM
users
WHERE
user_id = #{userId}
LIMIT
1
意見①:UKだしLIMIT句は不要でいいんじゃない?
意見②:他の存在チェックのSQLで、条件にUKを使用していないものもある。統一感を出すためにも、UKでもLIMIT句つける方針が良いのでは?
意見③:つけたところでパフォーマンス向上するんですかね?
結論
LIMIT句つけてもパフォーマンスはほぼ変化しない。
理由
SQLは、以下の順序で実行されます。
- from:対象テーブルの指定
- join:結合するテーブルの指定
- where:条件絞り込み
- group by:グループ化
- sum,avgなど:集合関数
- having:グループ化後の絞り込み
- select, distinct:抽出項目の指定
- order by:並べ替え
- limit:取得件数の指定
上記の通り、limitで件数を絞るのは最後になるため、前述のUKを条件に指定した存在チェックのSQLのパフォーマンスの改善という意味では、あまり意味を成さないことがわかりました。
最終結論
上記の調査をもとに、最終的にうちのチームでは、なくても良いが統一感を出しましょう。ということになり、基本的に存在チェックはLIMIT句を設ける運びとなりました。
以上