MySQLのインデックス結合の概要をまとめました。
1)Index Mergeメソッド
複数のrangeスキャンを有する行の取得とそれぞれの結果を一つに結合するのに使用。
※rangeスキャン
インデックスを使用して、一定の範囲にあるレコードのみ(=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、IN()などを使って定数と比較して取得)取得。
2)Explainの実行例
・typeカラムがindex_mergeと表示される。
・keyカラムは使用されたインデックスのリストが表示。
・key_lenカラムにはインデックスの最長キーパートが含まれる。
mysql> explain select * from sample where id_eki = '2164020' or build = '2010' \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sample type: index_merge possible_keys: build,id_eki key: id_eki,build key_len: 33,5 ref: NULL rows: 333 Extra: Using union(id_eki,build); Using where 1 row in set (0.00 sec) mysql> explain select * from sample where (id_eki = '2164020' or build = '2010') and registday = '20150330' \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sample type: index_merge possible_keys: build,id_eki key: id_eki,build key_len: 33,5 ref: NULL rows: 333 Extra: Using union(id_eki,build); Using where 1 row in set (0.00 sec)
3)アクセスアルゴリズム
・”intersect”、”union”、”sort_union”のアクセスアルゴリズム
・EXPLAINの”Extra”カラムに表示される。
4)インデックス結合の注意点
・あるキーでrangeスキャンが可能な場合、インデックス結合ユニオンアルゴリズムやインデックス結合ソートユニオンアルゴリズムは考慮されない。
・インデックス結合は、フルテキストインデックスには適用されない。
・バッファ、ソート、マージ操作の過程で多くのCPUとメモリを消費する。
・インデックスの選択性が低い場合はマージによって多くの行をリターンする事になる。
5)インデックス結合を無効にするには?
①optimizer_switchシステム変数を使用
mysql> SELECT @@optimizer_switch\G *************************** 1. row *************************** @@optimizer_switch: index_merge=on,index_merge_union=on, index_merge_sort_union=on, index_merge_intersection=on mysql> SET optimizer_switch='index_merge_union=off,index_merge_sort_union=off';
②IGNORE INDEXヒントを使用する
-
インストール、基本設定、文字コード、仕組み
- MySQLのインストール
- CentOS6でMySQL5.1からMySQL5.7へアップデートする手順、注意点
- CentOS6.10でMySQL5.7からMySQL8へアップデートする手順、注意点
- MySQLサーバーの起動スクリプト(v5.1)
- MySQLのファイルシステムとストレージエンジンの概要
- MySQLのデータ型の概要
- MySQLのサーバー、データベース、テーブル、カラムの文字コード設定とクライアントからのサーバー接続時の文字コード設定
- MySQLの”LOAD DATA INFILE”などでCSVファイル入出力時の文字コード、権限などの注意点
- セキュリティを考慮し、MySQLの匿名ユーザーにパスワードを設定、または削除
- CentOS6にphpMyAdminを導入
- MySQLのbツリーインデックスの概要とマルチカラムインデックス
- MySQLのプレフィックスインデックス、FULLTEXTインデックスの概要
- MySQLのEXPLAINの実行例
- MySQLのインデックス結合の概要
- MySQLのSelect文でインデックスのカラムのみ取得する場合のメリット
- MySQLのORDER BY句でインデックスを使用
- MySQLのPACK_KEYSオプション
- MySQLのインデックス統計更新の概要
- MySQL初期設定確認
- mysqladminコマンドでMySQLサーバーの状態確認
- mysqlshowコマンドで簡単にデータベース、テーブル定義の確認
- awkを使ってmysqlshowの必要な列のみ表示
- MySQLのスロークエリログの概要と表示方法
- show profileでクエリーの内部処理時間を調査
- MySQL Benchmark Suiteによるパフォーマンス測定
- MySQLの診断、監視に利用できる外部ツール
- WordPressデータベースのバックアップとリストア
- Bashスクリプトでmysqldumpバックアップと世代管理
- MySQLの壊れたテーブルのチェック、修復方法
- MySQLのインデックス統計更新の概要
- MySQLのフラグメンテーションの概要と改善方法
- MySQLのスレッド、コネクションに関する設定値、チューニング
- MySQLのセッション単位に設定するバッファーサイズ
- MySQLのクエリキャッシュの設定値、パフォーマンス
- MySQLのテーブルオープン、クローズとテーブルキャッシュのチューニング
- MyISAMキーキャッシュの概要とチューニング
- MySQLのソートに関する設定値とステータス
- MySQL innoDBの性能関連の設定値とステータス確認
- MySQL MyISAMの性能関連の設定値とステータス確認
インデックス
状態確認、調査
バックアップ、リストア、メンテナンス
パフォーマンス、チューニング