【例付き】インデックスマージとは?【MySQL】

当サイトはPR広告を利用しています。

インデックスマージについて、どういった機能なのかと公式リファレンスに記載されていた注意点も併せてお伝えします。

インデックスマージとは

インデックスマージとは複数のインデックスを利用してクエリを効率的に実行する最適化手法の一つです。複数のインデックスの利用の仕方ですが、複数のインデックスに対してそれぞれクエリを実行して取得した結果を組み合わせる形です。

インデックスマージという言葉だと複数のインデックスをくっつけるようなイメージを与えてしまいますが、そうではありません。実際はそれぞれのインデックスによって取得した結果の組み合わせという意味になります。

例えば以下のようなクエリの時にインデックスマージが利用される可能性があります。

SELECT * FROM users WHERE status = 'active' AND age < 30;

このクエリではWHERE句でstatusとageが利用されています。このstatusとageそれぞれに対しインデックスが作成されておりインデックスマージが採用された場合、statusのインデックスを利用してactiveなデータだけがまず取得され、ageのインデックスを利用して30歳未満のデータが取得され、それらの結果をAND条件で紐づけた結果を最終的なクエリの返却値として返します。

注意点

いくつか注意点を紹介してます。

必ずインデックスマージが採用されるとは限られない

WHERE句に含まれているカラムに対してすべてインデックスがあるからといって必ずしもインデックスマージが採用されるとは限りません。どのようにクエリを実行するのかはDBMSの一機能であるクエリオプティマイザが決めており、判断材料はテーブル内のレコード数、データの分布、クエリの内容、キャッシュの状態など多岐に渡ります。

これらの条件を踏まえたうえで、インデックスマージを利用するべきかを判断してくれているため、人が考えた時にはインデックスマージを使いそうな時であっても使わない可能性もあります。

インデックスマージが使われるかどうかはクエリオプティマイザがどんなクエリ実行計画を立てたのかを明らかにするEXPLAINコマンドで分かります。EXPLAINコマンドで出力される結果において、typeカラムの値が"index_merge"になっていればインデックスマージが使われます。

既知の制限事項がある

実際にインデックスマージを利用した方が良いような状況であったとしてインデックスマージが採用されない制限事項があることを公式ページが教えてくれています。

ANDやORで深くネストした複雑なクエリだと最適化されにくいとのことです。

書き換えの例として以下のものが挙げられています。

(x AND y) OR z => (x OR z) AND (y OR z)
(x OR y) AND z => (x AND z) OR (y AND z)

インデックスマージをクエリオプティマイザに採用させるためにはクエリ側の工夫も必要なようです。クエリ検討の際にはできるだけ複雑にならないようにしましょう。またクエリを最適化するにはサブクエリも大きく役立つので活用することをお勧めします。

参考

MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.2.1.3 インデックスマージの最適化

直近でおすすめの本

直近十数冊読んだ中で一番おすすめの本です。

ビジネスデザイナーという肩書きを持つイノベーションシンキングの世界的第一人者である濱口秀司さんの書かれた本です。肩書きだけだとどのようなことをしている人か分かりにくいかもしれませんが、USBメモリやマイナスイオンドライヤーなど誰もが知る有名商品の産みの親の方です。

アメリカのコンサルタントの中でも最高額のコンサルティングフィーを受け取っている方で、私の友人から聞いた話だとこの人のコンサルティングを受けるためには1時間でも7桁の額は準備する必要があるとのことでした。

濱口秀司さんは自分の中でイノベーションを起こすための型を持っており、その型について本の中でかなり詳しく教えてくれています。革新的なアイデアを出す方法をここで詳細にはお伝えしませんが、とてもざっくりとまとめると以下の手順になります。

バイアスの特定→バイアスの破壊

革新とは現状の破壊です。現在世の中にあるバイアスを認知するところからアイデアの創出は始まります。この本ではバイアスを認知する方法、そして破壊する方法を詳しく述べてくれています。個人開発をしようとしているけど何を作れば良いか思い浮かばない方やや会社を立ち上げようとしている方に特におすすめの本です。

過去におすすめした本は以下の記事にまとめています。