MySQLでOrder by句のソートでインデックスを使用して性能を向上させる方法についてです。
1)概要
・MySQLは行の検索とソートのいずれにおいても同じインデックスを使用する事が出来るのでソートと検索を同時に行うように設計すると性能を向上できる。
・ソートでインデックスが使用されるようにするには、一部の例外を除いてORDER BY句のカラムの指定順がインデックスと一致していて、すべてのカラムの昇順、降順の向きがそろっている必要がある。
2)ソートにインデックスが使用される例
※注)
すべての使用されていないインデックス部分とほかの部分がWHERE節内で定数であるカラムである場合、ORDER BYがインデックスに完全にマッチしない場合でもこのインデックスを使用できる。
SELECT * FROM table1 ORDER BY key_part1,key_part2,… ;
SELECT * FROM table1 WHERE key_part1 = 定数 ORDER BY key_part2;
SELECT * FROM table1 ORDER BY key_part1 DESC, key_part2 DESC;
SELECT * FROM table1 WHERE key_part1 = 0 ORDER BY key_part1 DESC, key_part2 DESC;
SELECT * FROM table1 WHERE key_part1 > 0 ORDER BY key_part1, key_part2 ;
3)ソートにインデックスが使用されない例
※注)
ソートにインデックスが使用されない場合でもWHERE句の条件に一致するレコードの検索にはインデックスが使用される。
・複数のキーに対してORDER BYを実行する場合。
SELECT * FROM table1 ORDER BY key1, key2;
・連続しないキー部分に対して ORDER BYを実行する場合。
SELECT * FROM table1 WHERE key2 = 定数 ORDER BY key_part2;
・ASCとDESCが混在している場合。
SELECT * FROM table1 ORDER BY key_part1 DESC, key_part2 ASC;
・行の取り出しに使用されるキーがORDER BYの実行に使用されるキーと異なる場合。
SELECT * FROM table1 WHERE key2 = 定数 ORDER BY key1;
・キーカラム名以外の項を含む式でORDER BYを使用する場合。
SELECT * FROM table1 ORDER BY ABS(key); 関連記事の目次
-
インストール、基本設定、文字コード、仕組み
- 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の性能関連の設定値とステータス確認
インデックス
状態確認、調査
バックアップ、リストア、メンテナンス
パフォーマンス、チューニング