SORT演算子は、入力されたデータをソートするために使用されます。
例:テーブルt1のデータをソートし、列c1で降順、列c2で昇順に並べ替えます。
obclient> CREATE TABLE t1(c1 INT, c2 INT);
Query OK, 0 rows affected
obclient> CREATE INDEX i1 ON t1(c1);
Query OK, 0 rows affected
obclient> EXPLAIN SELECT c1 FROM t1 ORDER BY c1 DESC, c2 ASC;
Query Plan:
================================================
|ID|OPERATOR |NAME |EST. ROWS|COST |
------------------------------------------------
|0 |SORT | |100000 |563390|
|1 | TABLE SCAN|T1(I1,Reverse)|100000 |385811|
================================================
Outputs & filters:
-------------------------------------
0 - output([T1.C1]), filter(nil), sort_keys([T1.C1, DESC], [T1.C2, ASC]), prefix_pos(1)
1 - output([T1.C1], [T1.C2]), filter(nil),
access([T1.C1], [T1.C2]), partitions(p0)
1 row in set
上記の例では、実行計画表示内の演算子番号0のSORTがテーブルt1のデータをソートします。実行計画表示内のoutputs & filtersは、SORT演算子の出力情報を以下のように詳細に示しています。
| 情報名 | 意味 |
|---|---|
| output | この演算子の出力列。 |
| filter | この演算子のフィルター述語。例では、SORT 演算子に filter が設定されていないため、nil となります。 |
| sort_keys([column, DESC],[column, ASC] ...) | column 列でソートします。
sort_keys([t1.c1, DESC],[t1.c2, ASC]) では、ソートキーをそれぞれ c1 列と c2 列と指定し、c1 列は降順、c2 列は昇順でソートします。 |
| prefix_pos(n) | ソート列の順序位置。例えば、sort_keys([t1.c1, DESC], [t1.c2, ASC]),prefix_pos(1) は、t1 テーブルのデータが c1 列で順序付けられており、c2 列のみをソートする必要があることを示します。n は1からカウントし、1は sort_keys 内の最初の列を表します。 |
ORDER BYステートメントブロックの後にLIMIT(MySQLモードのみ適用)ステートメントがある場合、オプティマイザーは実行計画をさらに最適化し、TOP-N SORT演算子を生成します。これは、ヒープソートを使用してトップNのデータを選択するものです。例:
obclient> EXPLAIN SELECT * FROM t1 WHERE c1 > 1 ORDER BY c1,c2 LIMIT 10;
Query Plan:
========================================
|ID|OPERATOR |NAME |EST. ROWS|COST |
----------------------------------------
|0 |LIMIT | |10 |42432|
|1 | TOP-N SORT | |10 |42431|
|2 | TABLE SCAN|t1(i1)|10000 |41764|
========================================
Outputs & filters:
-------------------------------------
0 - output([t1.c1], [t1.c2]), filter(nil), limit(10), offset(nil)
1 - output([t1.c1], [t1.c2]), filter(nil), sort_keys([t1.c1, ASC], [t1.c2, ASC]), topn(10), prefix_pos(1)
2 - output([t1.c1], [t1.c2]), filter(nil),
access([t1.c1], [t1.c2]), partitions(p0)
1 row in set
上記の例の実行計画表示では、topn(10)はLIMIT 10で必要なデータ量を表します。