MySQLのプレフィックスインデックスの概要についてまとめました。参考としてFULLTEXTインデックスの概要についても付け加えました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
プレフィックスインデックスの概要
・非常に長い文字数のカラムをインデックスとするとインデックスの容量が大きくなり、速度も遅くなる。
プレフィックスインデックスを使って最初の数文字をインデックスとする事によってインデックスファイルのサイズを減少でき、速度も向上する。
プレフィックスインデックスを使って最初の数文字をインデックスとする事によってインデックスファイルのサイズを減少でき、速度も向上する。
プレフィックスインデックスと選択性(selectivity)
1)概要
・重複しているキーのデータが少なければ選択性が高く、インデックスは有効に働く。例えば、誕生日を表すカラムは選択性が高いが、性別を表すカラムは選択性が低い。
・選択性を高く維持したままプレフィックスインデックスで少ない文字数を指定出来るとパフォーマンスを向上できる。
●選択性が高いプレフィックスインデックスの長さを求める例
①プレフィックスインデックスを使用しない場合の分布を調べる
SELECT COUNT(*) AS cnt, name FROM sample GROUP BY name ORDER BY cnt DESC;
②各プレフィックスの長さで分布状況を調べ、最適な長さを求める
SELECT COUNT(*) AS cnt, LEFT(name, 3) AS pref FROM sample GROUP BY pref ORDER BY cnt DESC;
SELECT COUNT(*) AS cnt, LEFT(name, 4) AS pref FROM sample GROUP BY pref ORDER BY cnt DESC;
SELECT COUNT(*) AS cnt, LEFT(name, 5) AS pref FROM sample GROUP BY pref ORDER BY cnt DESC;
・重複しているキーのデータが少なければ選択性が高く、インデックスは有効に働く。例えば、誕生日を表すカラムは選択性が高いが、性別を表すカラムは選択性が低い。
・選択性を高く維持したままプレフィックスインデックスで少ない文字数を指定出来るとパフォーマンスを向上できる。
●選択性が高いプレフィックスインデックスの長さを求める例
①プレフィックスインデックスを使用しない場合の分布を調べる
SELECT COUNT(*) AS cnt, name FROM sample GROUP BY name ORDER BY cnt DESC;
②各プレフィックスの長さで分布状況を調べ、最適な長さを求める
SELECT COUNT(*) AS cnt, LEFT(name, 3) AS pref FROM sample GROUP BY pref ORDER BY cnt DESC;
SELECT COUNT(*) AS cnt, LEFT(name, 4) AS pref FROM sample GROUP BY pref ORDER BY cnt DESC;
SELECT COUNT(*) AS cnt, LEFT(name, 5) AS pref FROM sample GROUP BY pref ORDER BY cnt DESC;
プレフィックスインデックスを定義
・インデックス指定でcol_name(N)構文を用いて、文字列カラムの最初のNキャラクタのみを使用したインデックスを作成できる。
・BLOBまたはTEXTカラムにインデックスを張る場合、インデックスに対して接頭辞長を指定しなければならない。
例)
ALTER TABLE sample ADD KEY (name(4));
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
・BLOBまたはTEXTカラムにインデックスを張る場合、インデックスに対して接頭辞長を指定しなければならない。
例)
ALTER TABLE sample ADD KEY (name(4));
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
FULLTEXTインデックスの概要
・FULLTEXTインデックスの定義は、テーブルを作成するときに、CREATE TABLEステートメントで提示することができるほか、ALTER TABLE、CREATE INDEXを使用してあとで付け加えることも可能。
FULLTEXT [INDEX|KEY] [index_name] (index_col_name,…) [index_option] ..
・フルテキスト検索に使用される。
・FULLTEXTインデックスをサポートするのはMyISAMストレージエンジンのみで、CHAR、VARCHAR、TEXTカラムについてのみサポートされる。
・インデックス設定は常にカラム全体を対象として、カラム接頭辞のインデックス設定は行われない。
FULLTEXT [INDEX|KEY] [index_name] (index_col_name,…) [index_option] ..
・フルテキスト検索に使用される。
・FULLTEXTインデックスをサポートするのはMyISAMストレージエンジンのみで、CHAR、VARCHAR、TEXTカラムについてのみサポートされる。
・インデックス設定は常にカラム全体を対象として、カラム接頭辞のインデックス設定は行われない。
-
インストール、基本設定、文字コード、仕組み
- 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の性能関連の設定値とステータス確認
インデックス
状態確認、調査
バックアップ、リストア、メンテナンス
パフォーマンス、チューニング