MySQLファイルのソート&インデックスのソート

3909 ワード

ソート操作はcpuを非常に消費する操作であり、システムの設定が適切でない場合やqueryが取り出したフィールドが多すぎる場合、MySQLは最適化されたソートアルゴリズムを放棄せざるを得ないが、比較的古いIOを2回必要とするテーブルデータのソートアルゴリズムを使用すると、ソート効率が非常に低下する.
インデックスを用いてソート操作を行い,主にインデックスの秩序性を利用した.インデックスによる検索では,順序付けされたデータアクセス順序が得られ,結果データを順次読み出した後はソート操作を必要とせず,さらにこの操作を回避し,ソート結果セットのquery性能を向上させた.
簡単です.できるだけインデックスソートを使用します.これでいいです.
実験をして、表の構造は以下の通りです.
mysql> show create table artist \G
*************************** 1. row ***************************
       Table: artist
Create Table: CREATE TABLE `artist` (
  `artist_id` int(10) unsigned NOT NULL,
  `type` enum('Band','Person','Unknown','Combination') NOT NULL,
  `name` varchar(255) NOT NULL,
  `gender` enum('Male','Female') DEFAULT NULL,
  `founded` year(4) DEFAULT NULL,
  `country_id` smallint(5) unsigned DEFAULT NULL,
  PRIMARY KEY (`artist_id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

ファイルのソートを使用するには、次の手順に従います.
mysql> Explain select name, founded from artist where name like 'AUSTRALIA%' order by founded \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: artist
         type: range
possible_keys: name
          key: name
      key_len: 257
          ref: NULL
         rows: 22
        Extra: Using index condition; Using filesort
1 row in set (0.00 sec)

結果を表示:
mysql> show session status like '%sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 0     |
| Sort_scan         | 0     |
+-------------------+-------+
4 rows in set (0.00 sec)

mysql> select name, founded from artist where name like 'AUSTRALIA%' order by founded \G
......
22 rows in set (0.00 sec)

mysql> show session status like '%sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 1     |
| Sort_rows         | 22    |
| Sort_scan         | 0     |
+-------------------+-------+
4 rows in set (0.00 sec)

いくつかのパラメータ
sort_merge_passesはsort bufferが十分ではないため、ソートする必要があるデータをセグメント化し、sort mergeのアルゴリズムによってプロセス全体のmerge総回数を完了しなければならない.一般的にパラメータ全体がsort buffer sizeを参照するのに十分であるかどうか.
sort range session/globalレベル(単位:回)range scanによるソートの合計回数.
sort rows session/globalレベル(単位:row)ソートの合計行数.
sort scanがスキャンテーブルを介して完了したソートの合計回数.
インデックスソート、extraのfilesortがなくなりました
mysql> Explain select name, founded from artist where name like 'AUSTRALIA%' order by name \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: artist
         type: range
possible_keys: name
          key: name
      key_len: 257
          ref: NULL
         rows: 22
        Extra: Using index condition
1 row in set (0.00 sec)

結果:
mysql> show session status like '%sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 0     |
| Sort_scan         | 0     |
+-------------------+-------+
4 rows in set (0.00 sec)

mysql> select name, founded from artist where name like 'AUSTRALIA%' order by name \G
......
22 rows in set (0.00 sec)

mysql> show session status like '%sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 0     |
| Sort_scan         | 0     |
+-------------------+-------+
4 rows in set (0.00 sec)

今回はすべてのパラメータが変わっていません.これがインデックスソートの力です.ほほほ.