🦔

そのSQL、インデックス効いてないかも

2023/10/15に公開

はじめに

アイディオットDX開発部の岩澤です。
今回は、インデックスが効かないSQLを記述したことで、せっかく貼ったインデックスが機能しない例をあげていきたいと思います。

インデックスが効かないSQL

1. インデックス列に対して演算をしている

SELECT * FROM some_table WHERE column * 1.1 < 100;

上記は以下のように書きかえるとインデックスを効かせることができます。

SELECT * FROM some_table WHERE column < 100 / 1.1;

2. インデックス列に対してSQL関数を使っている

SELECT * FROM some_table WHERE SUBSTR(column, 1, 1) = 'A';

3. IS NULLまたはIS NOT NULLを使っている

SELECT * FROM some_table WHERE column IS NULL;

B-treeインデックスは一般的にNULLはデータの値とはみなしておらず、保持していません。

4. 否定形を使っている

SELECT * FROM some_table WHERE column <> 1;

5. ORを用いている

SELECT * FROM some_table WHERE column = 1 OR column = 2;

INで書きかえることでインデックスを効かせることができる

SELECT * FROM some_table WHERE column IN (1, 2);

6. LIKE句で後方一致、中間一致を指定している

SELECT * FROM some_table WHERE column LIKE '%A';
SELECT * FROM some_table WHERE column LIKE '%A%';

前方一致ならインデックスが効きます。

SELECT * FROM some_table WHERE column LIKE 'A%';

7. 暗黙の型変換を行っている

column列がVARCHAR型だと仮定します。その場合、以下はインデックスが効きません。

SELECT * FROM some_table WHERE column = 10;

参考

達人に学ぶDB設計 徹底指南書

あとがき

AI・データ利活用をリードし、世界にインパクトを与えるプロダクトを開発しませんか?

アイディオットでは、今後の事業拡大及びプロダクト開発を担っていただけるエンジニアチームの強化を行っております。
さらに会社の成長を加速させるため、フロントエンドエンジニア、バックエンドエンジニア、インフラエンジニアのメンバーを募集しております!
日本を代表する企業様へ自社プロダクトを活用した、新規事業コンサルティング、開発にご興味のある方はお気軽にご連絡ください。

【リクルートページ】
https://aidiot.jp/recruit/
【募集ポジション一覧】
https://open.talentio.com/r/1/c/aidiot/homes/3925
【採用についてのお問合せ先】
株式会社アイディオット 採用担当:大島
メールアドレス:recruit@aidiot.jp

Discussion