ハロー、ききです!
今回は私が躓いたところ、
インデックスとは辞書で言う作印のようなものです、だから読み込み速度が上がるんだよ!
と言われても、それは手で調べるなら探し出すのは多少早いけど、名前入力して検索したらすぐ出てくるようなデータに対して索引ってなんなんだと思ってました…
今回はそんなインデックスを実行計画などをみながら話していこうと思います!
SQLはシステム開発で切っても切り離せない言語
さてみなさん、システム開発において、コーディングとSQLは切っても切れないものになっています。
特にバックエンド開発では、JavaやPythonなどでAPIを作成し、SQLでデータを取得して画面に表示する、と言う処理がよく出てきます。この記事を見てくれていると言うことは、少なくとも、
- SELECT
- INSERT
- UPDATE
- DELETE
といったCRUD処理についてはある程度書けますよ!って方が多いと思います。
実際コーディングするにあたってこのCRUD処理ができれば問題ないです。
「じゃあ、もうSQLはいいや!」
と思ったそこのあなた!
使うたびに読み込み時間がかかるのは使い手にとっては思った以上にストレスとなります。
そんな速度を改善するために必要なのが、インデックスです!
インデックスについて

インデックスとはテーブルとは別に作られる検索用専用の領域です!
インデックスがないとテーブル全件読読み込み検索条件で絞るので全件読み込む分時間がかかります。
インデックスがあるとまず検索専用の領域から条件に合う値を探し、
その値に対応するテーブル本体の行を取りに行きます。
じゃあ、全てのカラムにインデックスつけたらどんな検索でも高速になって最強じゃん!!
そう思った方もいらっしゃると思いますが、注意点があります。それは、
です。
インデックスを作るということは専用の領域を作るということです。
当然、データの更新や、登録、削除の際はその領域も作り直す必要があります。
そのため領域が多ければ多いほど作り直す時間がかかり、遅くなるということです。
インデックスが効きにくいことも!?

インデックスを作っていてもSQLによっては効果が出にくいことがあります。
例えば、次のようなワイルドカードをつけたLIKE検索です。
SELECT
*
FROM
products
WHERE
product_name LIKE '%りんご%';どこかに「りんご」を含むデータを探すような部分一致検索では、通常のインデックスが効きにくい場合があります。
逆に、前方一致ならインデックスを使いやすい場合があります。
SELECT
*
FROM
products
WHERE
product_name LIKE 'りんご%';インデックスは指定した値の付近を読み込むため、
前方が合致していれば読み込んだ範囲に該当することがあるから一つ目の部分一致よりはインデックスが効きます。
この辺りは使っているデータベースによっても挙動が変わるため、実際には実行計画を確認することが大切です。
まとめ
今回はSQLインデックスについて簡単にご説明しました!
インデックスは、データベースから目的のデータを早く探すための仕組みです。
データ件数が少ないうちは、インデックスを意識しなくても問題になりにくいです。
しかし、システムで扱うデータが増えてくると、検索速度の問題が出てきます。
そのときに、WHERE句やJOIN条件でよく使う列にインデックスを作ることで、
検索性能を改善できる場合があります。
ただし、インデックスは万能ではありません。
作りすぎるとINSERT、UPDATE、DELETEが遅くなることもあります。
また、SQLの書き方によってはインデックスが効きにくい場合もあります。
なので、インデックスを考えるときは、
- どの列でよく検索しているか
- どのSQLが遅いのか
- そのインデックスが本当に使われているか
- 登録や更新への影響は問題ないか
を確認することが大切です。
私がITの会社に入社した始めは、インデックスを気にすることはありませんでした。
参画したプロジェクトではすでにテーブルが作られて、ある程度システムも構築されていたからです。
そのため、インデックスに対する理解は、ぼんやりしたものでしたが、なんとかやっていけていました。
しかし、年数を重ねるごとに無視できない対応などを任せられるようになり、苦労した覚えがあります。
パフォーマンス向上のための調査なんかだったりね、、、
私の中で理解が深まったのは、実行計画を見てインデックスの効き目を見るということをすることです。
インデックスの作り方によって数値が全然違うので、
インデックスってこう作ればいいのかという気づきが大きかったです。
さて、次は実行計画の見方などをお話しできたらなって思います!
それでは、最後まで見てくれてありがとです!

