MySQL、Oracle、SQL ServerなどにおけるSQLのインデックス
Use The Index, Lukeでは、ベンダにとらわれないインデックスの説明を心がけています。製品特有の事柄については、以下のような表示をしています。- DB2
- Use The Index, Lukeでは、IBM DB2におけるインデックスをカバーしています。DB2 for Linux, UNIX and Windows, (LUW) V10.5/11.5 でテストしています。 MySQL Use The Index, Lukeでは、MySQLにおけるインデックスをカバーしています。MySQL 5.5と8.0.34でテストしており。 Oracle Use The Index, Lukeでは、Oracle databaseにおけるインデックスをカバーしています。Oracle 11gと23aiでテストしており。 PostgreSQL Use The Index, Lukeでは、PostgreSQLにおけるインデックスをカバーしています。PostgreSQL 9.0および14でテストしています。 SQL Server Use The Index, Lukeでは、Microsoft SQL Serverにおけるインデックスをカバーしています。SQL Server 2008R2および2022でテストしており。
目次
前書き - インデックスの作成はなぜ開発者のタスクなのか
インデックスの 内部構造 - インデックスは何に似ているか
インデックス リーフノード - 二重連結リスト
検索 ツリー(Bツリー) - バランス木
遅いインデックス パートI - インデックスを遅くする2つの原因
where 句 - 検索のパフォーマンスを改善するためにインデックスを作成
等価 演算子 - 一致するキーの検索
プライマリキー - インデックスの使い方を確認
複合インデックス - 複数列に対するインデックス
遅いインデックス パートII - 前の問題点が再び
関数 -
where
句の 中での関数大文字・小文字を区別する 検索 -
UPPER
とLOWER
ユーザ定義 関数 - 関数インデックスの制限
インデックスの作り過ぎ - 冗長性の排除法
パラメータ化 クエリ - セキュリティとパフォーマンスのために
範囲 検索 - 等価条件の一歩先へ
大なり、小なり、
BETWEEN
- 列の順番を 改めて考えるLIKE
フィルタに 対するインデックス - 全文検索用ではないLIKE
インデックスの結合 - 全列に それぞれインデックスを作ってはいけない理由
部分インデックス - 特定の行のみに対するインデックス
Oracleにおける
NULL
- 興味深い重要なことNULL
に対する インデックス - 全てのインデックスは部分インデックスNOT NULL
制約 - インデックスの使われ方に影響部分インデックスを エミュレートする - 関数インデックスを使った方法
処理しにくい条件 - よくあるアンチパターン
パフォーマンスと スケーラビリティ - ハードウェアについて
データ 量 - ずさんなインデックスが牙をむく
システム 負荷 - 本番の負荷がレスポンスタイムに与える影響
レスポンス タイムとスループット - 水平スケーラビリティ(スケールアウト
結合 処理 - 正しく使えば遅くない
データの クラスタリング - IO削減のために
フィルタ述語の意図的な使用 -
LIKE
句のチューニングのためにインデックスのみのスキャン - テーブルアクセスをなくす
索引構成 表 - テーブルを持たないクラスタ化されたインデックス
ソートと グルーピング - パイプライン化された
order by
、3番目の 力インデックスを使った Order by -
where
句の 相互作用ASC
/DESC
とNULL FIRST
/LAST
- インデックスの順番を変えるインデックスを使ったGroup By - パイプライン化された
group by
部分 結果 - 効果的なページング
最初のN行のみの 選択 - 最初の数行のみが必要な場合
次ページの 取得 - オフセットと検索方法の比較
窓関数 - 分析クエリを使ったページネーション
挿入、削除、 更新 - インデックスがDMLに与える影響