[TOC]
# 基于规则的路径选择
目前 OceanBase 数据库路径选择的规则体系分为前置规则(正向规则)和 Skyline 剪枝规则(反向规则)。前置规则直接决定了一个查询使用什么样的索引,是一个强匹配的规则体系。
Skyline 剪枝规则会比较两个索引,如果一个索引在一些定义的维度上优于(dominate)另外一个索引,那么不优的索引会被剪掉,最后没有被剪掉的索引会进行代价比较,从而选出最优的计划。
目前 OceanBase 数据库的优化器会优先使用前置规则选择索引,如果没有匹配的索引,那么 Skyline 剪枝规则会剪掉一些不优的索引,最后代价模型会在没有被剪掉的索引中选择代价最低的路径。
如下例所示,OceanBase 数据库的计划展示中会输出相应的路径选择的规则信息。
~~~
obclient>CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT, d INT, e INT,
UNIQUE INDEX k1(b), INDEX k2(b,c), INDEX k3(c,d));
Query OK, 0 rows affected (0.38 sec)
obclient> EXPLAIN EXTENDED SELECT * FROM t1 WHERE b = 1;
+-----------------------------------------------------------------+
| Query Plan |
+-----------------------------------------------------------------+
| =====================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
-------------------------------------
|0 |TABLE SCAN|t1(k1)|2 |94 |
=====================================
Outputs & filters:
-------------------------------------
0 - output([t1.a(0x7f3178058bf0)], [t1.b(0x7f3178058860)], [t1.c(0x7f3178058f80)], [t1.d(0x7f3178059310)], [t1.e(0x7f31780596a0)]), filter(nil),
access([t1.b(0x7f3178058860)], [t1.a(0x7f3178058bf0)], [t1.c(0x7f3178058f80)], [t1.d(0x7f3178059310)], [t1.e(0x7f31780596a0)]), partitions(p0),
is_index_back=true,
range_key([t1.b(0x7f3178058860)], [t1.shadow_pk_0(0x7f31780784b8)]), range(1,MIN ; 1,MAX),
range_cond([t1.b(0x7f3178058860) = 1(0x7f31780581d8)])
Optimization Info:
-------------------------------------
t1:optimization_method=rule_based, heuristic_rule=unique_index_with_indexback
obclient> EXPLAIN EXTENDED SELECT * FROM t1 WHERE c < 5 ORDER BY c;
+-----------------------------------------------------------------+
| Query Plan |
+-----------------------------------------------------------------+
| ====================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
------------------------------------
|0 |SORT | |200 |1054|
|1 | TABLE SCAN|t1 |200 |666 |
====================================
Outputs & filters:
-------------------------------------
0 - output([t1.a(0x7f3178059220)], [t1.b(0x7f31780595b0)], [t1.c(0x7f3178058e90)], [t1.d(0x7f3178059940)], [t1.e(0x7f3178059cd0)]), filter(nil), sort_keys([t1.c(0x7f3178058e90), ASC])
1 - output([t1.c(0x7f3178058e90)], [t1.a(0x7f3178059220)], [t1.b(0x7f31780595b0)], [t1.d(0x7f3178059940)], [t1.e(0x7f3178059cd0)]), filter([t1.c(0x7f3178058e90) < 5(0x7f3178058808)]),
access([t1.c(0x7f3178058e90)], [t1.a(0x7f3178059220)], [t1.b(0x7f31780595b0)], [t1.d(0x7f3178059940)], [t1.e(0x7f3178059cd0)]), partitions(p0),
is_index_back=false, filter_before_indexback[false],
range_key([t1.a(0x7f3178059220)]), range(MIN ; MAX)always true
t1:optimization_method=cost_based, avaiable_index_name[t1,k3], pruned_index_name[k1,k2]
~~~
其中 optimization\_method 展示了具体的规则信息,它有以下两种形式:
* 如果`optimization_method=rule_based`, 那么就是命中了前置规则,同时会展示出具体命中的规则名称,unique\_index\_with\_indexback 表示命中了前置规则的第三条规则(唯一性索引全匹配+回表+回表数量少于一定的阈值)。
* 如果`optimization_method=cost_based`, 那么就是基于代价选择出来的,同时会展示出来 Skyline 剪枝规则剪掉了那些访问路径(pruned\_index\_name)以及剩下了那些访问路径(avaiable\_index\_name)。
## 前置规则
目前 OceanBase 数据库的前置规则只用于简单的单表扫描。因为前置规则是一个强匹配的规则体系,一旦命中,就直接选择命中的索引,所以要限制它的使用场景,以防选错计划。
目前 OceanBase 数据库根据“查询条件是否能覆盖所有索引键”和“使用该索引是否需要回表”这两个信息,将前置规则按照优先级划分成如下三种匹配类型:
* 匹配“唯一性索引全匹配+不需要回表(主键被当成唯一性索引来处理)”,则选择该索引。如果存在多个这样的索引,选择索引列数最小的一个。
* 匹配“普通索引全匹配+不需要回表”,则选择该索引。如果存在多个这样的索引,选择索引列数最小的一个。
* 匹配“唯一性索引全匹配+回表+回表数量少于一定的阈值”,则选择该索引。如果存在多个这样的索引,选择回表数量最小的一个。
这里需要注意的是,索引全匹配是指在索引键上都存在等值条件(对应于 get 或者 multi-get)。
如下示例中,查询 Q1 命中了索引 uk1(唯一性索引全匹配+不需要回表);查询 Q2 命中了索引 uk2(唯一性索引全匹配+回表+回表行数最多 4 行)。
~~~
obclient>CREATE TABLE test(a INT PRIMARY KEY, b INT, c INT, d INT, e INT,
UNIQUE KEY UK1(b,c), UNIQUE KEY UK2(c,d) );
Query OK, 0 rows affected (0.38 sec)
Q1:
obclient>SELECT b,c FROM test WHERE (b = 1 OR b = 2) AND (c = 1 OR c =2);
Q2:
obclient>SELECT * FROM test WHERE (c = 1 OR c =2) OR (d = 1 OR d = 2);
~~~
## Skyline 剪枝规则
Skyline 算子是学术界在 2001 年提出的一个新的数据库算子(它并不是标准的 SQL 算子)。自此之后,学术界对 Skyline 算子有大量的研究(包括语法、语义和执行等)。
Skyline 从字面上的理解是指天空中的一些边际点,这些点组成搜索空间中最优解的集合。例如要寻找价格最低并且路途最短的一家旅馆,想象一个二维空间,有两个维度,横轴表示价格,纵轴表示距离,二维空间上的每个点表示一个旅馆。
如下图所示,不论最后的选择如何,最优解肯定是在这一条天空的边际线上。假设点 A 不在 Skyline 上,那么肯定能够在 Skyline 上找到在两个维度上都比 A 更优的点 B,在这个场景中就是距离更近,价格更便宜的旅馆,称为点 B dominate A。所以 Skyline 一个重要应用场景就是用户没办法去衡量多个维度的比重,或者多个维度不能综合量化(如果可以综合量化,使用 “SQL 函数+ ORDER BY ”就可以解决了)。
![](https://img.kancloud.cn/10/44/1044642478af9770f9ae0368fece5893_642x454.png)
Skyline 操作是在给定对象集 O 中找出不被别的对象所 dominate 的对象集合。若一个对象 A 在所有维度都不被另一个对象 B 所 dominate,并且 A 至少在一个维度上 dominate B,则称 A dominate B。所以在 Skyline 操作中比较重要的是维度的选择以及在每个维度上的 dominate 的关系定义。假设有 N 个索引的路径`<idx_1,idx_2,idx_3...idx_n>`可以供优化器选择,如果对于查询 Q,索引 idx\_x 在定义的维度上 dominate 索引 idx\_y,那就可以提前把索引 idx\_y 剪掉,不让它参与最终代价的运算。
## 维度的定义
针对 Skyline 剪枝,对每个索引(主键也是一种索引)定义了如下三个维度:
* 是否回表
* 是否存在 intersting order
* 索引前缀能否抽取 query range
通过如下示例进行分析:
~~~
obclient> CREATE TABLE skyline(
pk INT PRIMARY KEY, a INT, b INT, c INT,
KEY idx_a_b(a, b),
KEY idx_b_c(b, c),
KEY idx_c_a(c, a));
Query OK, 0 rows affected (0.09 sec)
~~~
* 回表:该查询是否需要需要回查主表。
~~~
/* 走索引 idx_a_b 的话就需要回查主表,因为索引 idx_a_b 没有 c 列*/
obclient>SELECT /*+INDEX(skyline idx_a_b)*/ * FROM skyline;
~~~
* interesting order: 考虑是否有合适的序可以利用。
~~~
/* 索引 idx_b_c 可以把 ORDER BY 语句消除*/
obclient>SELECT pk, b FROM skyline ORDER BY b;
~~~
* 索引前缀能否抽取 query range。
~~~
/*可以看到走索引 idx_c_a 就可以快速定位到需要的行的范围,不用全表扫描*/
obclient>SELECT pk, b FROM skyline WHERE c > 100 AND c < 2000;
~~~
基于这三个维度,定义了索引之间的 dominate 关系,如果索引 A 在三个维度上都不比索引 B 差,并且其中至少有一个维度比 B 好,那么就可以直接把 B 索引剪掉,因为基于索引 B 最后生成的计划肯定不会比索引 A 好。
* 如果索引 idx\_A 不需要回表,而索引 idx\_B 需要回表,那么在这个维度上索引 idx\_A dominate idx\_B。
* 如果在索引 idx\_A上抽取出来的 intersting order 是向量`Va<a1, a2, a3 ...an>`, 在索引 idx\_B 上抽出来的interesting order 是向量`Vb<b1, b2, b3...bm>`, 如果`n > m`, 并且对于`ai = bi (i=1..m`), 那么在这个维度上索引 idx\_A dominate idx\_B。
* 如果在索引 idx\_A 能用来抽取的 query range 的列集合是`Sa<a1, a2, a3 ...an>`,在索引 idx\_B 上能用来抽取 query range 的列集合是`Sb <b1, b2, b3...bm>`, 如果 Sa 是 Sb 的 super set, 那么在这个维度上索引 idx\_A dominate idx\_B。
#### **回表**
这个维度初看比较简单,就是查询所需列是否在索引中。其中,一些案例需要特殊考虑,例如当主表和索引表都没有 interesting order 和抽取不了 query range 的情况下,直接走主表不一定是最优解。
~~~
obclient>CREATE TABLE t1(
pk INT PRIMARY KEY, a INT, b INT, c INT, v1 VARCHAR(1000),
v2 VARCHAR(1000), v3 VARCHAR(1000), v4 VARCHAR(1000),INDEX idx_a_b(a, b));
Query OK, 0 rows affected (0.09 sec)
obclient>SELECT a, b,c FROM t1 WHERE b = 100;
~~~
<table data-tag="table" id="table-7m6-nxd-zl3" class="table"><colgroup span="1" width="180" data-tag="col" id="col-63n-247-k42" colwidth="1*" colnum="1" colname="col1" style="width:25%" class="col"></colgroup><colgroup span="1" width="180" data-tag="col" id="col-p7s-t0z-n9s" colwidth="1*" colnum="2" colname="col2" style="width:25%" class="col"></colgroup><colgroup span="1" width="180" data-tag="col" id="col-asy-dvk-sp1" colwidth="1*" colnum="3" colname="col3" style="width:25%" class="col"></colgroup><colgroup span="1" width="180" data-tag="col" id="col-wpm-cn0-34l" colwidth="1*" colnum="4" colname="col4" style="width:25%" class="col"></colgroup><thead id="thead-xnn-wye-5pq" class="thead"><tr id="tr-ndn-k5i-3um"><th id="td-4tu-04o-2rd"><p id="p-8lv-mko-ngk"><b>索引</b></p></th><th id="td-p62-qv4-qpj"><p id="p-f7h-dk2-ib1"><b>Index Back</b></p></th><th id="td-daw-891-c30"><p id="p-79g-tyz-cnm"><b>Interesting Order</b></p></th><th id="td-27u-lgy-2iy"><p id="p-glm-e70-w9x"><b>Query Range</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-wvo-npf-dgy" class="tbody"><tr data-tag="tr" id="tr-vru-fbb-5ie" class="tr"><td data-tag="td" id="td-shr-tcs-3q3" class="td"><p id="p-wjp-snj-56w">primary</p></td><td data-tag="td" id="td-glp-t56-pio" class="td"><p id="p-5q3-sdi-oim">no</p></td><td data-tag="td" id="td-7xf-mu9-ktc" class="td"><p id="p-svt-mos-drc">no</p></td><td data-tag="td" id="td-9iy-zyl-cgj" class="td"><p id="p-7a9-nzs-45c">no</p></td></tr><tr data-tag="tr" id="tr-jub-dyr-i9s" class="tr"><td data-tag="td" id="td-g4q-peu-stz" class="td"><p id="p-l44-5fx-hf7">idx_a_b</p></td><td data-tag="td" id="td-p7h-pvi-kn6" class="td"><p id="p-p49-vyb-tah">yes</p></td><td data-tag="td" id="td-0rq-i97-j52" class="td"><p id="p-2mz-xos-jny">no</p></td><td data-tag="td" id="td-c8q-8ha-ido" class="td"><p id="p-bgz-qh3-nfb">no</p></td></tr></tbody></table>
主表很宽,而索引表很窄,虽然从维度上主表 dominate 索引 idx\_a\_b,然而,索引扫描加回表的代价不一定会比主表全表扫描来的慢。简单来说,索引表可能只需要读一个宏块,而主表可能需要十个宏块。这种情况下,需要对规则做一些放宽,考虑具体的过滤条件。
#### **Interesting Order**
优化器通过 Interesting Order 利用底层的序,就不需要对底层扫描的行做排序,还可以消除 ORDER BY,进行 MERGE GROUP BY,提高 Pipeline(不需要进行物化)等。
~~~
obclient>CREATE TABLE skyline(
pk INT PRIMARY KEY, v1 INT, v2 INT, v3 INT, v4 INT, v5 INT,
KEY idx_v1_v3_v5(v1, v3, v5),
KEY idx_v3_v4(v3, v4));
Query OK, 0 rows affected (0.10 sec)
obclient>CREATE TABLE tmp (c1 INT PRIMARY KEY, c2 INT, c3 INT);
Query OK, 0 rows affected (0.06 sec)
obclient>(SELECT DISTINCT v1, v3 FROM skyline JOIN tmp WHERE skyline.v1 = tmp.c1
ORDER BY v1, v3) UNION (SELECT c1, c2 FROM tmp);
~~~
![](https://img.kancloud.cn/48/97/48973dc7a8301cb01d0f743f9c6e650d_702x395.png)
从执行计划可以看到,ORDER BY 被消除了,同时使用了 MERGE DISTINCT,UNION 也没有做 SORT。可以看到,从底层 TABLE SCAN 吐出来的序,可以被上层的算子使用。换句话说,保留 idx\_v1\_v3\_v5 吐出来的行的顺序,可以让后面的算子在保序的情况下执行更优的操作。优化器在识别这些序的情况下,才能生成更优的执行计划。
所以 Skyline 剪枝对 interesting order 的判断,需要充分考虑各个索引能够最大利用的序。例如上述最大的序其实是`v1,v3`而不仅仅是 v1,它从 MERGE JOIN 吐出来的序(v1, v3) 可以到 MERGE DISINCT 算子, 再到最后的 UNISON DISTINCT 算子。
#### **Query Range**
Query range 的抽取可以方便底层直接根据抽取出来的 range 定位到具体的宏块,而从减少存储层的 IO。
例如`SELECT * FROM t1 WHERE pk < 100 AND pk > 0`就可以直接根据一级索引的信息定位到具体的宏块,加速查询,越精确的 query range 能够让数据库扫描更少的行。
~~~
obclient> CREATE TABLE t1 (
pk INT PRIMARY KEY, a INT, b INT,c INT,
KEY idx_b_c(b, c),
KEY idx_a_b(a, b));
Query OK, 0 rows affected (0.12 sec)
obclient>SELECT b FROM t1 WHERE a = 100 AND b > 2000;
~~~
对于索引 idx\_b\_c 它能抽出 query range 的索引前缀是 (b),对于索引 idx\_a\_b 它能抽出 query range 的索引前缀是 (a, b),所以在这个维度上,索引 idx\_a\_b dominate idx\_b\_c。
## 综合举例
~~~
obclient>CREATE TABLE skyline(
pk INT PRIMARY KEY, v1 INT, v2 INT, v3 INT, v4 INT, v5 INT,
KEY idx_v1_v3_v5(v1, v3, v5),
KEY idx_v3_v4(v3, v4));
Query OK, 0 rows affected (0.10 sec)
obclient>CREATE TABLE tmp (c1 INT PRIMARY KEY, c2 INT, c3 INT);
Query OK, 0 rows affected (0.06 sec)
obclient>SELECT MAX(v5) FROM skyline WHERE v1 = 100 AND v3 > 200 GROUP BY v1;
~~~
<table data-tag="table" id="table-8be-4ac-7jb" class="table"><colgroup span="1" width="180" data-tag="col" id="col-r2z-9vv-54c" colwidth="1*" colnum="1" colname="col1" style="width:25%" class="col"></colgroup><colgroup span="1" width="180" data-tag="col" id="col-hpv-bra-smz" colwidth="1*" colnum="2" colname="col2" style="width:25%" class="col"></colgroup><colgroup span="1" width="180" data-tag="col" id="col-gio-j20-gx3" colwidth="1*" colnum="3" colname="col3" style="width:25%" class="col"></colgroup><colgroup span="1" width="180" data-tag="col" id="col-mnq-yif-vae" colwidth="1*" colnum="4" colname="col4" style="width:25%" class="col"></colgroup><thead id="thead-nnh-wsx-57g" class="thead"><tr id="tr-qfd-hv8-9fr"><th id="td-m77-ru9-us6"><p id="p-9af-gns-a39"><b>索引</b></p></th><th id="td-lm3-6u2-7vb"><p id="p-stv-tah-lrp"><b>Index Back</b></p></th><th id="td-rb3-zpc-q2h"><p id="p-6u8-p0j-ui5"><b>Interesting order</b></p></th><th id="td-4vk-r68-puh"><p id="p-azf-ne6-2zk"><b>Query range</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-v9h-3ql-boq" class="tbody"><tr data-tag="tr" id="tr-6p6-11w-9qo" class="tr"><td data-tag="td" id="td-ti0-brt-6j4" class="td"><p id="p-9m8-7zs-f4b">primary</p></td><td data-tag="td" id="td-lh9-qx0-0tk" class="td"><p id="p-axo-t4x-1o4">Not need</p></td><td data-tag="td" id="td-9bl-8xl-yly" class="td"><p id="p-93w-u1c-ydu">No</p></td><td data-tag="td" id="td-95o-q9s-aov" class="td"><p id="p-ad6-7al-al9">No</p></td></tr><tr data-tag="tr" id="tr-h6q-aif-diz" class="tr"><td data-tag="td" id="td-9wf-5lu-mjw" class="td"><p id="p-9ql-po3-5b2">idx_v1_v3_v5</p></td><td data-tag="td" id="td-795-jsr-gez" class="td"><p id="p-xng-43i-lxg">Not need</p></td><td data-tag="td" id="td-zd6-dy5-s0u" class="td"><p id="p-udc-wk5-sl9">(v1)</p></td><td data-tag="td" id="td-73w-bd2-m17" class="td"><p id="p-08w-5s8-s05">(v1, v3)</p></td></tr><tr data-tag="tr" id="tr-mgn-sg3-g65" class="tr"><td data-tag="td" id="td-q10-2a6-5ti" class="td"><p id="p-lbf-bxx-ish">idx_v3_v4</p></td><td data-tag="td" id="td-c5d-qif-d08" class="td"><p id="p-gcz-62f-mt4">Need</p></td><td data-tag="td" id="td-iuj-nno-e9j" class="td"><p id="p-584-kin-xzu">No</p></td><td data-tag="td" id="td-nlb-ouw-4bv" class="td"><p id="p-5jc-adc-f7w">(v3)</p></td></tr></tbody></table>
可以看到索引 idx_v1_v3_v5 在三个维度上都不比主键索引或索引 idx_v3_v4 差。所以在规则系统下,会直接剪掉主键索引和索引 idx_v3_v4。维度的合理定义,决定了 Skyline 剪枝是否合理。错误的维度,将会导致该索引提前被剪掉,从而导致永远生成不了最优的计划。
- 前言
- 1.说明
- 2.文档更新说明
- docker
- 01.docker安装
- 02.docker加速器
- 03.docker基本使用
- 04.docker 镜像与容器
- 05.Dockerfile
- 06.docker阿里镜像仓库
- 07.docker私有镜像仓库harbor
- 08.docker网络
- 09.docker项目实战01
- 10.docker项目实战02
- 11.docker componse
- 12.docker-compose常用命令
- 13.docker compose 案例
- 14.docker swarm集群
- 15.docker swarm常用命令
- 16.docker swarm 案例
- 17.volume
- 18.network
- 19.idea中部署项目到docker
- 20.docker目录方式挂载sqlite
- 21.docker常用命令补充
- 22.nginx容器代理静态文件403解决
- 23.docker集群管理平台
- k8s
- 01.Kubernetes介绍
- 02.K8s基本概念
- 03.K8s架构图
- 04.Minikube单节点环境搭建
- 05.kubeadm集群安装1.14.0
- 06.虚拟机静态网络配置
- 07.kubeadm高可用集群安装1.14.0
- 08 高可用VIP配置(keepalived+haproxy)
- 09.高可用免密登录
- 10.kubeadm init流程
- 11.k8s体验
- 12.网络插件
- 13.Ingress
- 14.Ingress分类
- 15.Dashboard
- 16.存储
- 01.Volumes
- 02.nfs
- 03.PV PVC
- 04.StorageClass
- 17.基础组件
- 01.Pod
- 02.Service
- 03.ReplicaSet(RS)
- 04.Deployment
- 06.Namespace
- 02.DaemonSet
- 03.StatefulSet
- 04.ReplicationController(RC)
- 06.Job
- 09.PetSet
- 10.StatefulSets
- 11.Federation
- 12.Secret
- 05.Resources
- 13.UserAccount/ServiceAccount
- 14.RBAC
- 18.核心组件
- Master组件
- 01.kube-apiserver
- 02.etcd
- 03.kube-controller-manager
- 04.cloud-controller-manager
- 05.kube-scheduler
- 06.DNS
- Node组件
- 01.kubelet
- 02.kube-proxy
- 03.docker
- 04.RKT
- 05.supervisord
- 06.fluentd
- kubectl
- 19.K8S服务更新部署
- 20.CI/CD
- 01.java安装
- 02.maven安装
- 03.gitlab安装
- 04.git安装
- 05.jenkins安装
- 06.k8s集群
- 07.DockerHub
- 08.实战
- 21.日志
- 01.不同组件日志
- 02.LogPilot+ES+Kibana
- 22.监控
- 23.k8s部署ocp项目[mysql]
- 01.ocp介绍
- 02.环境准备
- 03.镜像准备
- 04.部署说明
- 05.eureka-server
- 06.mysql
- 07.redis
- 08.auth-server
- 09.user-center
- 10.new-api-gateway
- 11.back-center
- 飞致云kubeoperator
- 01.kubeoperator介绍
- 02.kubeoperator安装
- 飞致云DataEase
- 项目介绍
- 系统架构
- 安装部署
- 在线安装
- 离线安装
- 用户手册
- 通用功能
- 数据源
- 数据集
- 视图
- 仪表板
- 系统管理
- 用户管理
- 飞致云JumpServer
- TIDB
- 网络
- 交换机
- ISO/OSI协议模型详解
- 交换CCNP
- RSTP快速生成树协议
- MST多生成树协议
- 以太网信道【应用广泛】
- 广播和多播抑制
- 多层交换
- ARP地址解析协议抑制
- VLAN间路由
- 热备份路由协议HSRP【思科私有】
- 虚拟路由器冗余协议VRRP
- linux
- 01.时间同步
- linux时间不能同步
- Linux挂载磁盘
- 安装ftp
- linux环境ftp账号
- HTTP状态码
- 宝塔
- Centos安装vsftp
- nginx ssl 配置
- datax
- 1.geom类型迁移扩展
- python安装
- 消息中间件
- 1.RocketMQ
- 1.RocketMQ单机环境安装
- 前端
- node踩坑之npm
- 数据库
- Mysql安装
- ClickHouse
- OceanBase数据库
- OceanBase介绍
- OceanBase数据库整体架构
- 快速入门
- 资源准备
- 安装 OBD部署 OceanBase 数据库
- 基本操作
- 数据库操作
- 表操作
- 索引操作
- 插入数据
- 删除数据
- 更新数据
- 提交事务
- 回滚事务
- 安装部署
- 使用 RPM 包安装 OceanBase 数据库
- 使用源码构建 OceanBase 数据库
- 设置无密码 SSH 登录
- 配置时钟源
- 数据分布
- 集群管理
- 租户与资源管理
- 数据分布1
- 数据副本与服务
- 数据均衡
- 数据模型
- 多租户架构
- 系统租户
- 普通租户
- 表格和表组
- 二级索引
- 无主键表
- 视图
- 高可用
- 高可用方案
- 部署模式
- redo 日志管理控制
- 事务管理
- 隔离级别
- 并发控制
- 全局时间戳服务
- 本地事务
- 分布式事务
- 分布式查询
- 存储架构
- LSM Tree 架构
- 内存表 MemTable
- 块存储 SSTable
- 转储和合并
- 缓存机制
- 读写流程
- DDL
- SQL 引擎
- SQL 请求执行流程
- 查询改写
- 基于规则的查询改写
- 基于代价的查询改写
- 查询优化
- 访问路径
- 基于规则的路径选择
- 基于代价的路径选择
- 联接算法
- 联接算法
- 联接顺序
- SQL 执行计划
- 执行计划算子
- TABLE SCAN
- TABLE LOOKUP
- JOIN
- COUNT
- GROUP BY
- WINDOW FUNCTION
- SUBPLAN FILTER
- DISTINCT
- SEQUENCE
- MATERIAL
- SORT
- LIMIT
- FOR UPDATE
- SELECT INTO
- SUBPLAN SCAN
- UNION
- INTERSECT
- EXCEPT/MINUS
- INSERT
- DELETE
- UPDATE
- MERGE
- EXCHANGE
- GI
- 执行计划缓存
- 快速参数化
- 实时执行计划展示
- 分布式执行计划
- 分布式执行和并行查询
- 分布式计划的生成
- 分布式执行计划调度
- 分布式执行计划管理
- 并行查询的执行
- 并行查询的参数调优
- 备份与恢复
- 备份架构
- 恢复架构
- Backup Set
- Archive Log Round
- 管理员指南
- 数据库基础组件介绍
- 数据库管理工具介绍
- OceanBase 客户端
- MySQL 客户端
- 数据库基础管理
- OceanBase 集群管理
- 集群参数管理
- 查询集群参数
- 修改集群参数
- Zone 管理
- 增加或删除 Zone
- 启动或停止 Zone
- 修改 Zone
- OBServer 管理
- 查看 OBServer 状态
- 停止 OBServer
- 启动 OBServer
- 管理 OBServer 节点状态
- 资源管理
- 创建资源单元
- 查看资源单元
- 修改资源单元
- 删除资源单元
- 创建资源池
- 查看资源配置
- 修改资源池
- 删除资源池
- 租户管理
- 创建用户租户
- 新建租户
- 查看租户
- 修改租户
- 删除租户
- 查看租户会话
- 终止租户会话
- 租户管理变量
- 内存管理
- OceanBase 内存结构
- OceanBase 数据库内存上限
- 系统内部内存管理
- 租户内部内存管理
- 执行计划缓存
- 常见内存问题
- 数据库对象管理
- 管理表
- 关于表
- 创建表
- 定义自增列
- 定义列的约束类型
- 查看表的定义
- 更改表
- 清空表
- 删除表
- 管理表组
- 关于表组
- 表组管理命令
- 管理索引
- 关于索引
- 创建索引
- 查看索引
- 删除索引
- 视图和同义词管理
- 管理视图
- 管理同义词
- 数据分布和链路管理
- 分区表和分区索引管理
- 关于分区
- 分区策略
- 创建分区表
- 一级分区表
- 二级分区表
- 维护分区表
- 一级分区表
- 二级分区表
- 分区裁剪
- 分区命名与查询
- 在分区表上建立索引
- 局部索引
- 全局索引
- 使用索引
- 副本管理
- 表级副本的使用
- Locality 管理
- 修改租户的 Locality
- 事务管理
- 提交事务
- 回滚事务
- 事务隔离级别
- 用户权限管理
- 创建用户
- 修改用户权限
- 查看白名单
- 锁定和解锁用户
- 删除用户
- 数据高可用
- 回收站管理
- 回收站支持的对象
- 数据库、表和索引级回收站
- 租户级回收站
- 物理备份与恢复管理
- 部署 NFS
- 备份数据
- 通过命令行备份
- 查看备份进度
- 停止备份
- 删除过期的备份
- 清理备份数据
- 取消清理备份数据
- 恢复数据
- 执行恢复
- 查看恢复进度和结果
- 备份维护
- 开发者指南
- 关于OceanBase数据库
- OceanBase 集群简介
- OceanBase 租户简介
- MySQL 租户数据库对象
- MySQL 客户端
- OceanBase 客户端(obclient)
- 关于结构化查询语言
- Java 数据库连接驱动(JDBC)
- 连接OceanBase数据库
- 通过 MySQL 客户端连接 OceanBase 租户
- 通过 obclient 连接 OceanBase 租户
- 创建 OceanBase 示例数据库 TPCC
- 通过 obclient 探索 OceanBase MySQL 租户
- 查询表数据
- 关于查询语句
- 查询表里符合特定搜索条件的数据
- 对查询的结果进行排序
- 从多个表里查询数据
- 在查询中使用操作符和函数
- 查看查询执行计划
- 在查询中使用 SQL Hint
- 关于查询超时设计
- 关于 DML 语句和事务
- 关于 DML 语句
- 关于 INSERT 语句
- 关于 UPDATE 语句
- 关于 DELETE 语句
- 关于 REPLACE INTO 语句
- 关于事务控制语句
- 提交事务
- 回滚事务
- 事务保存点
- 关于事务超时
- 创建和管理数据库对象
- 关于 DDL 语句
- 创建数据库
- 创建和管理表
- 关于 SQL 数据类型
- 创建表
- 关于自增列
- 关于列的约束类型
- 关于表的索引
- 闪回被删除的表
- 创建和管理分区表
- 分区路由
- 分区策略
- 分区表的索引
- 分区表使用建议
- 创建和管理表组
- 关于表组
- 创建表时指定表组
- 查看表组信息
- 向表组中增加表
- 删除表组
- 创建和管理视图
- 创建视图
- 修改视图
- 删除视图
- 向 OceanBase 迁移数据
- DataX
- 不同数据源的 DataX 读写插件示例
- OceanBase 数据加载技术
- 附录
- OceanBase 常用参数和变量
- OceanBase 常用 SQL
- SQL参考
- 基本元素
- 运算符
- 函数
- 函数
- 聚集函数
- 分析函数
- 信息函数
- 其它函数
- 查询和子查询
- 连接
- 集合
- SQL语句
- 通用语法
- ALTER DATABASE
- ALTER OUTLINE
- ALTER RESOURCE POOL
- ALTER RESOURCE UNIT
- ALTER SYSTEM
- ALTER TABLE
- ALTER TABLEGROUP
- ALTER TENANT
- ALTER USER
- CREATE DATABASE
- CREATE INDEX
- CREATE OUTLINE
- CREATE RESOURCE POOL
- CREATE RESOURCE UNIT
- CREATE RESTORE POINT
- CREATE SYNONYM
- CREATE TABLE
- CREATE TABLEGROUP
- CREATE TENANT
- CREATE USER
- CREATE VIEW
- DELETE
- DROP DATABASE
- DROP INDEX
- DROP OUTLINE
- DROP RESOURCE POOL
- DROP RESOURCE UNIT
- DROP RESTORE POINT
- DROP TABLE
- DROP TABLEGROUP
- DROP TENANT
- DROP SYNONYM
- DROP USER
- DROP VIEW
- EXPLAIN
- FLASHBACK DATABASE
- FLASHBACK TABLE
- FLASHBACK TENANT
- GRANT
- INSERT
- KILL
- PURGE DATABASE
- PURGE INDEX
- PURGE RECYCLEBIN
- PURGE TABLE
- PURGE TENANT
- RENAME TABLE
- RENAME USER
- REPLACE
- REVOKE
- SAVEPOINT
- SCHEMA
- SELECT
- SESSION
- SET PASSWORD
- SHOW GRANTS
- SHOW RECYCLEBIN
- TRANSACTION
- TRUNCATE TABLE
- UPDATE
- SQL调优指南
- SQL请求执行流程
- SQL 执行计划
- SQL 执行计划简介
- 执行计划算子
- TABLE SCAN
- TABLE LOOKUP
- JOIN
- COUNT
- GROUP BY
- WINDOW FUNCTION
- SUBPLAN FILTER
- DISTINCT
- SEQUENCE
- MATERIAL
- SORT
- LIMIT
- FOR UPDATE
- SELECT INTO
- SUBPLAN SCAN
- UNION
- INTERSECT
- EXCEPT/MINUS
- INSERT
- DELETE
- UPDATE
- MERGE
- EXCHANGE
- GI
- 执行计划缓存
- 快速参数化
- 实时执行计划展示
- 分布式执行计划
- 分布式执行和并行查询
- 分布式计划的生成
- 分布式执行计划调度
- 分布式执行计划管理
- 并行查询的执行
- 并行查询的参数调优
- 参考指南
- 系统视图
- 概述
- 字典视图
- mysql.help_topic
- mysql.help_category
- mysql.help_keyword
- mysql.help_relation
- mysql.db
- mysql.proc
- mysql.time_zone
- mysql.time_zone_name
- mysql.time_zone_transition
- mysql.time_zone_transition_type
- mysql.user
- information_schema.CHARACTER_SETS
- information_schema.COLLATIONS
- information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
- information_schema.COLUMNS
- information_schema.DBA_OUTLINES
- information_schema.ENGINES
- information_schema.GLOBAL_STATUS
- information_schema.GLOBAL_VARIABLES
- information_schema.KEY_COLUMN_USAGE
- information_schema.PARAMETERS
- information_schema.PARTITIONS
- information_schema.PROCESSLIST
- information_schema.REFERENTIAL_CONSTRAINTS
- information_schema.ROUTINES
- information_schema.SCHEMATA
- information_schema.SCHEMA_PRIVILEGES
- information_schema.SESSION_STATUS
- information_schema.SESSION_VARIABLES
- information_schema.STATISTICS
- information_schema.TABLES
- information_schema.TABLE_CONSTRAINTS
- information_schema.TABLE_PRIVILEGES
- information_schema.USER_PRIVILEGES
- information_schema.USER_RECYCLEBIN
- information_schema.VIEWS
- oceanbase.CDB_OB_BACKUP_ARCHIVELOG_SUMMARY
- oceanbase.CDB_OB_BACKUP_JOB_DETAILS
- oceanbase.CDB_OB_BACKUP_SET_DETAILS
- oceanbase.CDB_OB_BACKUP_PROGRESS
- oceanbase.CDB_OB_BACKUP_SET_EXPIRED
- oceanbase.CDB_OB_BACKUP_ARCHIVELOG_PROGRESS
- oceanbase.CDB_OB_BACKUP_CLEAN_HISTORY
- oceanbase.CDB_OB_BACKUP_TASK_CLEAN_HISTORY
- oceanbase.CDB_OB_RESTORE_PROGRESS
- oceanbase.CDB_OB_RESTORE_HISTORY
- oceanbase.CDB_CKPT_HISTORY
- oceanbase.CDB_OB_BACKUP_VALIDATION_JOB
- oceanbase.CDB_OB_BACKUP_VALIDATION_JOB_HISTORY
- oceanbase.CDB_OB_TENANT_BACKUP_VALIDATION_TASK
- oceanbase.CDB_OB_BACKUP_VALIDATION_TASK_HISTORY
- oceanbase.CDB_OB_BACKUP_BACKUP_ARCHIVELOG_SUMMARY
- oceanbase.CDB_OB_BACKUP_BACKUPSET_TASK_HISTORY
- oceanbase.CDB_OB_BACKUP_BACKUPSET_TASK
- oceanbase.CDB_OB_BACKUP_BACKUPSET_JOB_HISTORY
- oceanbase.CDB_OB_BACKUP_BACKUPSET_JOB
- oceanbase.CDB_OB_BACKUP_SET_OBSOLETE
- 性能视图
- gv$plan_cache_stat
- gv$plan_cache_plan_stat
- gv$session_event
- gv$session_wait
- gv$session_wait_history
- gv$system_event
- gv$sesstat
- gv$sysstat
- gv$sql_audit
- gv$latch
- gv$memory
- gv$memstore
- gv$memstore_info
- gv$plan_cache_plan_explain
- gv$obrpc_outgoing
- gv$obrpc_incoming
- gv$sql
- gv$sql_plan_monitor
- gv$outline
- gv$concurrent_limit_sql
- gv$sql_plan_statistics
- gv$server_memstore
- gv$unit_load_balance_event_history
- gv$tenant
- gv$database
- gv$table
- gv$unit
- gv$partition
- gv$lock_wait_stat
- gv$session_longops
- gv$tenant_memstore_allocator_info
- gv$minor_merge_info
- gv$tenant_px_worker_stat
- gv$partition_audit
- gv$ps_stat
- gv$ps_item_info
- gv$sql_workarea
- gv$sql_workarea_histogram
- gv$ob_sql_workarea_memory_info
- gv$server_schema_info
- gv$merge_info
- gv$lock
- gv$sstable
- gv$ob_trans_table_status
- v$statname
- v$event_name
- v$session_event
- v$session_wait
- v$session_wait_history
- v$sesstat
- v$sysstat
- v$system_event
- v$memory
- v$memstore
- v$memstore_info
- v$plan_cache_stat
- v$plan_cache_plan_stat
- v$plan_cache_plan_explain
- v$sql_audit
- v$obrpc_outgoing
- v$obrpc_incoming
- v$sql
- v$sql_monitor
- v$sql_plan_monitor
- v$sql_plan_statistics
- v$unit
- v$partition
- v$lock_wait_stat
- v$session_longops
- v$latch
- v$tenant_memstore_allocator_info
- v$tenant_px_worker_stat
- v$partition_audit
- v$ob_cluster
- v$ob_standby_status
- v$ob_cluster_stats
- v$ob_cluster_event_history
- v$ps_stat
- v$ps_item_info
- v$sql_workarea
- v$sql_workarea_active
- v$sql_workarea_histogram
- v$ob_sql_workarea_memory_info
- v$ob_timestamp_service
- v$server_schema_info
- v$merge_info
- v$lock
- v$sql_monitor_statname
- v$restore_point
- v$ob_cluster_failover_info
- v$encrypted_tables
- v$encrypted_tablespaces
- v$sstable
- v$ob_trans_table_status
- 系统变量
- 系统变量概述
- auto_increment_increment
- auto_increment_offset
- autocommit
- character_set_client
- character_set_connection
- character_set_database
- character_set_results
- character_set_server
- character_set_system
- collation_connection
- collation_database
- collation_server
- interactive_timeout
- last_insert_id
- max_allowed_packet
- sql_mode
- time_zone
- tx_isolation
- version_comment
- wait_timeout
- binlog_row_image
- character_set_filesystem
- connect_timeout
- datadir
- debug_sync
- div_precision_increment
- explicit_defaults_for_timestamp
- group_concat_max_len
- identity
- lower_case_table_names
- net_read_timeout
- net_write_timeout
- read_only
- sql_auto_is_null
- sql_select_limit
- timestamp
- tx_read_only
- version
- sql_warnings
- max_user_connections
- init_connect
- license
- net_buffer_length
- system_time_zone
- query_cache_size
- query_cache_type
- sql_quote_show_create
- max_sp_recursion_depth
- sql_safe_updates
- ob_proxy_partition_hit
- ob_log_level
- ob_max_parallel_degree
- ob_query_timeout
- ob_read_consistency
- ob_enable_transformation
- ob_trx_timeout
- ob_enable_plan_cache
- ob_enable_index_direct_select
- ob_proxy_set_trx_executed
- ob_enable_aggregation_pushdown
- ob_last_schema_version
- ob_global_debug_sync
- ob_proxy_global_variables_version
- ob_enable_trace_log
- ob_enable_hash_group_by
- ob_enable_blk_nestedloop_join
- ob_bnl_join_cache_size
- ob_org_cluster_id
- ob_plan_cache_percentage
- ob_plan_cache_evict_high_percentage
- ob_plan_cache_evict_low_percentage
- recyclebin
- ob_capability_flag
- ob_stmt_parallel_degree
- is_result_accurate
- error_on_overlap_time
- ob_compatibility_mode
- ob_create_table_strict_mode
- ob_sql_work_area_percentage
- ob_route_policy
- ob_enable_transmission_checksum
- foreign_key_checks
- ob_enable_truncate_flashback
- ob_tcp_invited_nodes
- sql_throttle_current_priority
- sql_throttle_priority
- sql_throttle_rt
- sql_throttle_network
- auto_increment_cache_size
- ob_enable_jit
- ob_timestamp_service
- plugin_dir
- undo_retention
- ob_sql_audit_percentage
- ob_enable_sql_audit
- optimizer_use_sql_plan_baselines
- optimizer_capture_sql_plan_baselines
- parallel_max_servers
- parallel_servers_target
- ob_trx_idle_timeout
- block_encryption_mode
- ob_reserved_meta_memory_percentage
- ob_check_sys_variable
- tracefile_identifier
- transaction_isolation
- ob_trx_lock_timeout
- validate_password_check_user_name
- validate_password_length
- validate_password_mixed_case_count
- validate_password_number_count
- validate_password_policy
- validate_password_special_char_count
- default_password_lifetime
- ob_trace_info
- secure_file_priv
- ob_pl_block_timeout
- performance_schema
- transaction_read_only
- resource_manager_plan
- 系统配置项
- 系统配置项概述
- auto_leader_switch_interval
- auto_delete_expired_backup
- autoinc_cache_refresh_interval
- audit_sys_operations
- audit_trail
- balancer_idle_time
- balancer_log_interval
- balancer_timeout_check_interval
- balancer_task_timeout
- balancer_tolerance_percentage
- balancer_emergency_percentage
- balance_blacklist_failure_threshold
- balance_blacklist_retry_interval
- backup_concurrency
- backup_dest
- backup_net_limit
- backup_recovery_window
- backup_region
- builtin_db_data_verify_cycle
- bf_cache_miss_count_threshold
- bf_cache_priority
- cache_wash_threshold
- clog_cache_priority
- clog_sync_time_warn_threshold
- clog_disk_usage_limit_percentage
- clog_transport_compress_all
- clog_transport_compress_func
- clog_persistence_compress_func
- clog_max_unconfirmed_log_count
- cluster
- cluster_id
- cpu_count
- cpu_quota_concurrency
- cpu_reserved
- config_additional_dir
- data_copy_concurrency
- data_dir
- datafile_disk_percentage
- dtl_buffer_size
- datafile_size
- debug_sync_timeout
- default_compress_func
- default_compress
- default_progressive_merge_num
- default_row_format
- devname
- data_disk_usage_limit_percentage
- disk_io_thread_count
- dead_socket_detection_timeout
- enable_clog_persistence_compress
- election_cpu_quota
- enable_one_phase_commit
- enable_sys_unit_standalone
- enable_pg
- enable_smooth_leader_switch
- election_blacklist_interval
- enable_election_group
- enable_auto_leader_switch
- enable_global_freeze_trigger
- enable_manual_merge
- enable_merge_by_turn
- enable_perf_event
- enable_rebalance
- enable_record_trace_log
- enable_record_trace_id
- enable_early_lock_release
- enable_rereplication
- enable_rich_error_msg
- enable_rootservice_standalone
- enable_sql_audit
- enable_sql_operator_dump
- enable_async_syslog
- enable_syslog_recycle
- enable_syslog_wf
- enable_upgrade_mode
- enable_separate_sys_clog
- enable_ddl
- enable_major_freeze
- enable_rebuild_on_purpose
- enable_log_archive
- enable_monotonic_weak_read
- external_kms_info
- freeze_trigger_percentage
- flush_log_at_trx_commit
- fuse_row_cache_priority
- force_refresh_location_cache_interval
- force_refresh_location_cache_threshold
- get_leader_candidate_rpc_timeout
- global_major_freeze_residual_memory
- global_write_halt_residual_memory
- ignore_replay_checksum_error
- global_index_build_single_replica_timeout
- high_priority_net_thread_count
- ignore_replica_checksum_error
- ignore_replay_checksum_error
- index_cache_priority
- index_clog_cache_priority
- index_info_block_cache_priority
- internal_sql_execute_timeout
- large_query_worker_percentage
- large_query_threshold
- leak_mod_to_check
- lease_time
- location_cache_cpu_quota
- location_cache_expire_time
- location_cache_priority
- location_cache_refresh_min_interval
- location_fetch_concurrency
- location_refresh_thread_count
- log_archive_checkpoint_interval
- log_archive_concurrency
- log_restore_concurrency
- major_freeze_duty_time
- max_kept_major_version_number
- max_string_print_length
- max_syslog_file_count
- merge_stat_sampling_ratio
- major_compact_trigger
- memory_chunk_cache_size
- memory_limit
- memory_limit_percentage
- memory_reserved
- merge_thread_count
- merger_check_interval
- merger_completion_percentage
- merger_switch_leader_duration_time
- merger_warm_up_duration_time
- max_px_worker_count
- migration_disable_time
- min_observer_version
- minor_deferred_gc_time
- minor_freeze_times
- minor_warm_up_duration_time
- mysql_port
- minor_merge_concurrency
- multiblock_read_gap_size
- multiblock_read_size
- micro_block_merge_verify_level
- migrate_concurrency
- minor_compact_trigger
- memstore_limit_percentage
- net_thread_count
- obconfig_url
- ob_enable_batched_multi_statement
- partition_table_check_interval
- partition_table_scan_batch_count
- plan_cache_evict_interval
- px_task_size
- px_workers_per_cpu_quota
- replica_safe_remove_time
- resource_hard_limit
- resource_soft_limit
- rootservice_async_task_queue_size
- rootservice_async_task_thread_count
- rootservice_list
- rootservice_ready_check_interval
- row_compaction_update_limit
- row_purge_thread_count
- rpc_port
- rpc_timeout
- restore_concurrency
- rootservice_memory_limit
- rebuild_replica_data_lag_threshold
- schema_history_expire_time
- ssl_client_authentication
- server_check_interval
- server_data_copy_in_concurrency
- server_data_copy_out_concurrency
- server_permanent_offline_time
- stack_size
- server_balance_critical_disk_waterlevel
- server_balance_disk_tolerance_percent
- system_memory
- server_balance_cpu_mem_tolerance_percent
- server_cpu_quota_max
- server_cpu_quota_min
- sql_audit_memory_limit
- sys_bkgd_io_high_percentage
- sys_bkgd_io_low_percentage
- sys_bkgd_io_timeout
- sys_bkgd_net_percentage
- sys_bkgd_migration_change_member_list_timeout
- sys_bkgd_migration_retry_num
- syslog_level
- switchover_process_thread_count
- system_cpu_quota
- sys_cpu_limit_trigger
- syslog_io_bandwidth_limit
- tablet_size
- tableapi_transport_compress_func
- tenant_task_queue_size
- tenant_groups
- trace_log_slow_query_watermark
- trace_log_sampling_interval
- trx_2pc_retry_interval
- trx_force_kill_threshold
- tde_method
- token_reserved_percentage
- unit_balance_resource_weight
- user_block_cache_priority
- user_row_cache_priority
- user_tab_col_stat_cache_priority
- user_iort_up_percentage
- use_large_pages
- virtual_table_location_cache_expire_time
- workers_per_cpu_quota
- wait_leader_batch_count
- writing_throttling_maximum_duration
- writing_throttling_trigger_percentage
- weak_read_version_refresh_interval
- workarea_size_policy
- zone
- zone_merge_concurrency
- zone_merge_order
- zone_merge_timeout
- ob_ssl_invited_common_names
- ssl_external_kms_info
- ob_event_history_recycle_interval
- backup_log_archive_checkpoint_interval
- plsql_ccflags
- plsql_code_type
- plsql_debug
- plsql_optimize_level
- plsql_v2_compatibility
- plsql_warnings
- recyclebin_object_expire_time
- log_archive_batch_buffer_limit
- clog_disk_utilization_threshold
- backup_backup_archive_log_batch_count
- backup_backup_archivelog_retry_interval
- backup_backupset_batch_count
- backup_backupset_retry_interval
- open_cursors
- fast_recovery_concurrency
- 预留关键字
- 部署实践
- 设置无密码 SSH 登录
- 单机安装
- 本地安装
- 分布式安装
- 创建租户
- OceanBaseDeploy(OBD)常用命令
- 大数据
- 数据仓库分层
- 数据仓库分层实践
- hive安装
- hive命令
- hadoop安装
- jdk安装
- 应龙inlong
- 网关
- apisix
- apisix2.7源码安装
- apisix rpm2.6安装
- apisix-dashboard2.7 rpm安装
- apisix-dashboard使用
- apisix-dashboard进阶