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\G
*************************** 1. row ***************************
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 列排序。 |
如果 ORDER BY 语句块后面还有 LIMIT(仅适用于 MySQL 模式)语句,优化器会进一步优化执行计划,生成 TOP-N SORT算子,即采用堆排序来选择 TOP-N 的数据,示例如下:
obclient> EXPLAIN SELECT * FROM t1 WHERE c1 > 1 ORDER BY c1,c2 LIMIT 10\G
*************************** 1. row ***************************
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 需要的数据量。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




