南大通用GBase 8a透明存储加密encrypt功能使用

GBase 8a MPP Cluster 数据加密encrypt,提供对数据库落地数据的软加密功能,用来满足用户的安全需求,提高系统的安全性。数据加密按照数据文件中的 DC 为最小单位进行,可以实现表级或者列级不同粒度的加密要求。数据库中所有加密数据都使用同一个密钥,系统启动时会自动读取已创建的密钥文件内容。数据使用密钥文件内容加解密后,密钥文件内容就不能再改变。

密钥证书通过密码二次加密,在集群【所有调度节点(coordinator/gcluster)】全部停止后,比如断电,升级等操作,再启动时,【需要】通过SQL提供密码进行激活证书。重启单独部署的数据节点,或顺序重启调度节点,不需要密钥激活证书,会自动从当前可用的调度节点获得。提醒:V86版本在Build43R35.5Patch10及以后版本才实现。其它版本在有个别节点服务重启后,仍需要重新open,建议升级。

也支持空密码的证书,其在服务启动后证书自动打开,不需要输入密码激活证书,易用性提高,但安全性降低,不建议正式生产环境使用。

参考

针对数据显示层的,可以使用GBase 8a的脱敏功能

概述

数据加密支持的操作

  • 支持加密关键字 encrypt 建表;
  • 支持表级或者列级不同粒度的加密要求;
  • 支持表加密属性的查询;
  • 支持密钥证书管理包括密钥证书的创建、打开、关闭、口令修改、密钥转换操作;
  • 支持密钥类型转换,即从明文密钥转换到密文密钥,或从密文密钥转换到明文密钥:
  • 明文密钥:无须用户口令,可随机生成也可手动输入;
  • 密文密钥:须用户输入口令,根据口令对随机生成的密钥加密存储;
  • 支持查询当前密钥证书状态;
  • 支持行存列加密。
  • 加密算法:AES128,SM4(ECB 默认,CBC,OFB,CFB)

相关参数

加密算法参数

该参数支持SM4,经测试,9.5.3.27支持,更早版本请联系售后或对应技术支持人员。

加密算法一旦指定,请不要再修改,否则以前其它算法加密的表,将无法读取。该参数不支持set方式,必须修改配置文件并重启服务。

gbase_encrypt_new_mode

  • 1:AES128 默认
  • 2:SM4

所有调度和计算节点都要增加如下参数,来指定用SM4算法。 默认是AES无需指定。9.5.3新版本才支持。

_gbase_encrypt_new_mode=2

从集群层查看该参数

GBase client 9.5.3.27.140fa78d1. Copyright (c) 2004-2022, GBase.  All Rights Reserved.

gbase> show variables like '%gbase_encrypt_new_mode%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| gbase_encrypt_new_mode | 2     |
+------------------------+-------+
1 row in set (Elapsed: 00:00:00.00)

密钥获取参数

调度节点重启时,密钥会自动同步。而数据节点gnode服务重启时,通过如下两个参数,自动从管理节点获得密钥,以实现只要有1个调度节点可用,就不需要输入证书激活密码的效果。

提醒:该功能在86243R35.5Patch10及以后版本才实现。其它版本在有个别节点服务重启后,仍需要重新open,建议升级。

只需要修改数据节点配置即可。

安装目录下/gnode/config/gbase_8a_gbase.cnf

在[gbased]部分,增加2个参数,其中encrypt_server_host是调度节点的IP, 多个IP之间用逗号分割。encrypt_server_port是调度节点的端口号。

[gbased]
........
encrypt_server_host=10.0.2.201,10.0.2.202,10.0.2.203
encrypt_server_port=5258

证书管理

证书由用户创建,并设置启用密码。强烈建议用户备份生成的证书文件,并牢记密码,否则加密的数据将无法使用。

创建证书

创建明文、密文密钥证书,如果 password 为空,则创建明文密钥证书,不需要口令;如果 password 非空,则创建密文密钥证书,需要口令;密钥证书只有一份不能重复创建。

语法

CREATE ENCRYPTION CERTIFICATE IDENTIFIED BY ‘password’
[CONTENT ‘content_value’]

password 密钥证书口令
content_value:密钥内容关键字,可选项,如果不指定该关键字,则创建时由系统自动生成密钥;如果指定,则需要用户手动输入密钥,内容不做限制,最大支持 128 字节。

密钥用于对数据加解密。密文密钥,会通过AES128算法,根据口令进行加密,然后将加密后的数据保存为证书文件。

警告:
1、数据库并不记录密码,如果你忘记了密码,则证书无法打开,所有加密的数据也将不再能够读取。
2、密码保存在管理节点运行环境内(内存里),如有部分节点重启,无论是管理还是数据,只要尚有任意一个管理节点存活,密码就会自动同步给【新启动】的节点。但是当所有管理节点都停掉,比如断电,再次重启时,必须【人工】打开证书,因为数据库并不记录密码。

  • 建议对密钥证书进行备份,如果证书丢失会影响已有数据的解密操作;
  • 打开密文密钥证书后,方可对加密列做 dml 操作;
  • 关闭密文密钥证书后,所有对加密列的 dml 操作将会失效;
  • 密钥证书只有一份,即只能创建一次,不能重复创建;

证书位置

证书存放在 config 目录,集群环境下,gnode 与 gcluster 都会生成相同的密钥证书文件:
gnode:$GBASE_BASE/config/encryption.crt
gcluster:$GCLUSTER_BASE/config/encryption.crt

创建样例

如下创建了一个指定密钥内容的证书,密码为12345678。只能建一个证书。

gbase> create encryption certificate identified by '12345678' content '12345678ABCDEFG';
Query OK, 0 rows affected (Elapsed: 00:00:00.02)

gbase> create encryption certificate identified by '12345678' content '12345678ABCDEFG';
ERROR 1850 (HY000): encryption certificate already exists.
gbase>


gbase> ^CAborted
[gbase@rh6-1 ~]$ ll /opt/gcluster/config/
total 28
-rw-r----- 1 gbase gbase   93 Dec  4 15:12 encryption.crt
-rw-r----- 1 gbase gbase 3120 Nov 30 14:44 gbase_8a_gcluster.cnf
-rw-r----- 1 gbase gbase   49 Oct 27 08:51 gcluster_uuid.cnf
-rw-r----- 1 gbase gbase  239 Oct 27 08:51 gcmmonit.conf
-rw-r----- 1 gbase gbase  851 Oct 27 08:51 gcmonit.conf
-rw-r----- 1 gbase gbase 4129 Oct 27 08:51 gc_recover.cnf
[gbase@rh6-1 ~]$ ll /opt/gnode/config/
total 16
-rw-r----- 1 gbase gbase   93 Dec  4 15:12 encryption.crt
-rw-r----- 1 gbase gbase 2025 Nov  5 12:16 gbase_8a_gbase.cnf
-rw-r----- 1 gbase gbase   49 Oct 27 08:51 gcluster_uuid.cnf
-rw-r----- 1 gbase gbase   91 Oct 27 08:51 synctool.conf
[gbase@rh6-1 ~]$

查看证书状态

通过如下元数据表查看证书当前状态。其中

  • ENCRYPTION_CERTIFICATE_STATUS表是查看当前节点当前服务的
  • ALL_ENCRYPTION_CERTIFICATE_STATUS是查看所有节点,所有服务的
SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
gbase> SELECT * FROM
    -> INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
+------+-----------+----------+-------------+
| HOST | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+------+-----------+----------+-------------+
| ::   | YES       |        1 | OFF         |
+------+-----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)


gbase> SELECT * FROM INFORMATION_SCHEMA.ALL_ENCRYPTION_CERTIFICATE_STATUS;
+--------------+-----------+----------+-------------+
| NODE_NAME    | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+--------------+-----------+----------+-------------+
| coordinator1 | YES       |        1 | ON          |
| coordinator2 | YES       |        1 | ON          |
| coordinator3 | YES       |        1 | ON          |
| node1        | YES       |        1 | ON          |
| node2        | YES       |        1 | ON          |
| node3        | YES       |        1 | ON          |
+--------------+-----------+----------+-------------+
6 rows in set (Elapsed: 00:00:00.02)

KEY_TYPE :0是明文,1是密文。
OPEN_STATUS:OFF 代表证书没有打开,尚未生效, ON是生效中。

注意:明文密码是自动打开中的,也不需要打开和关闭,只有密文的才需要。

修改证书密码

通过如下的语法修改证书的打开密码。其中前面是老密码,后面是新密码。

gbase> alter encryption certificate identified by '12345678' to '123456789';
Query OK, 0 rows affected (Elapsed: 00:00:00.02)

明文密码打开证书

明文密码是自动打开的。如果从密码修改成名为,也会自动打开,从名为修改成密文,重启后是默认自动关闭的,需要输入密码打开。

gbase> SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
+------------+-----------+----------+-------------+
| HOST       | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+------------+-----------+----------+-------------+
| 10.0.2.101 | YES       |        0 | ON          |
+------------+-----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> ^CAborted
[gbase@gbase_rh7_001 ~]$ gcluster_services all restart
Stopping GCMonit success!
Stopping gcrecover :                                       [  OK  ]
Stopping gcluster :                                        [  OK  ]
Stopping gcware :                                          [  OK  ]
Stopping gbase :                                           [  OK  ]
Stopping syncserver :                                      [  OK  ]
Starting gcware :                                          [  OK  ]
Starting gcluster :                                        [  OK  ]
Starting gcrecover :                                       [  OK  ]
Starting gbase :                                           [  OK  ]
Starting syncserver :                                      [  OK  ]
Starting GCMonit success!
[gbase@gbase_rh7_001 ~]$ gccli

GBase client 9.5.2.36.125743. Copyright (c) 2004-2021, GBase.  All Rights Reserved.

gbase> SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
+------------+-----------+----------+-------------+
| HOST       | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+------------+-----------+----------+-------------+
| 10.0.2.101 | YES       |        0 | ON          |
+------------+-----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> alter encryption certificate identified by '' to '12345678';
Query OK, 0 rows affected (Elapsed: 00:00:00.03)

gbase> SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
+------------+-----------+----------+-------------+
| HOST       | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+------------+-----------+----------+-------------+
| 10.0.2.101 | YES       |        1 | ON          |
+------------+-----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> ^CAborted
[gbase@gbase_rh7_001 ~]$ gcluster_services all restart
Stopping GCMonit success!
Stopping gcrecover :                                       [  OK  ]
Stopping gcluster :                                        [  OK  ]
Stopping gcware :                                          [  OK  ]
Stopping gbase :                                           [  OK  ]
Stopping syncserver :                                      [  OK  ]
Starting gcware :                                          [  OK  ]
Starting gcluster :                                        [  OK  ]
Starting gcrecover :                                       [  OK  ]
Starting gbase :                                           [  OK  ]
Starting syncserver :                                      [  OK  ]
Starting GCMonit success!
[gbase@gbase_rh7_001 ~]$ gccli

GBase client 9.5.2.36.125743. Copyright (c) 2004-2021, GBase.  All Rights Reserved.

gbase> SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
+------------+-----------+----------+-------------+
| HOST       | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+------------+-----------+----------+-------------+
| 10.0.2.101 | YES       |        1 | OFF         |
+------------+-----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)

关闭明文正式会报错

gbase> alter encryption certificate close;
ERROR 1850 (HY000): this syntax is unsupported with current encrypt type

密文密码打开

如果密码不对,是无法打开证书的。

gbase> alter encryption certificate open identified by '1234567';
ERROR 1850 (HY000): decrypt failed, please check password.
gbase>
gbase> alter encryption certificate open identified by '123456789';
Query OK, 0 rows affected (Elapsed: 00:00:00.01)

gbase> SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
+------+-----------+----------+-------------+
| HOST | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+------+-----------+----------+-------------+
| ::   | YES       |        1 | ON          |
+------+-----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)

关闭证书

通过如下方式关闭证书。

gbase> alter encryption certificate close;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)

gbase> SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
+------+-----------+----------+-------------+
| HOST | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+------+-----------+----------+-------------+
| ::   | YES       |        1 | OFF         |
+------+-----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)

存储加密

通过encypt关键字,在建表时,给指定的表或列设置加密属性。不支持修改加密属性。你可以通过重建一个新表或新列,实现修改加密属性。

证书必须处于打开状态,否则无法向加密表插入数据。

整表加密

gbase> SELECT * FROM INFORMATION_SCHEMA.ENCRYPTION_CERTIFICATE_STATUS;
+------+-----------+----------+-------------+
| HOST | IS_CREATE | KEY_TYPE | OPEN_STATUS |
+------+-----------+----------+-------------+
| ::   | YES       |        1 | OFF         |
+------+-----------+----------+-------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> create table t_encrypt(id int)encrypt;
Query OK, 0 rows affected (Elapsed: 00:00:00.97)

gbase> insert into t_encrypt values(1),(2);
ERROR 1705 (HY000): gcluster DML error: Commit failed, no successful node of some suffix
cause: (GBA-01EX-700) Gbase general error: Encrypt key invalid.
(GBA-01EX-700) Gbase general error: Encrypt key invalid.
gbase>

打开证书,然后可以正常的处理数据了。

gbase> alter encryption certificate open identified by '123456789';
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> insert into t_encrypt values(1),(2);
Query OK, 2 rows affected (Elapsed: 00:00:00.21)
Records: 2  Duplicates: 0  Warnings: 0

gbase> select * from t_encrypt;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (Elapsed: 00:00:00.01)

gbase>

部分列加密

要实现部分列加密,则只在列上增加加密属性,不要在表上增加加密属性,原因看后面的【注意】事项。

gbase> create table t_encrypt_2(id int,name varchar(100) encrypt);
Query OK, 0 rows affected (Elapsed: 00:00:00.79)
gbase> insert into t_encrypt_2 values(1,'first'),(2,'second');

Query OK, 2 rows affected (Elapsed: 00:00:00.74)
Records: 2  Duplicates: 0  Warnings: 0

gbase> select *from t_encrypt_2;
+------+--------+
| id   | name   |
+------+--------+
|    1 | first  |
|    2 | second |
+------+--------+
2 rows in set (Elapsed: 00:00:00.01)

对于非加密的列,即使证书关闭,也可以查询。加密列则报错。

gbase> alter encryption certificate close;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> select *from t_encrypt_2;
ERROR 1708 (HY000): [10.0.2.202:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: (GBA-01EX-700) Gbase general error: Decrypt key invalid.
SQL: SELECT /*::ffff:10.0.2.201_8_24_2020-12-04_15:52:38*/ /*+ TID('3538981') */ `testdb.t_encrypt_2`.`id` AS `id`, `testdb.t_encrypt_2`.`name` AS `name` FROM `testdb`.`t_encrypt_2_n1` `testdb.t_encrypt_2`
gbase> select id from t_encrypt_2;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (Elapsed: 00:00:00.03)

gbase> select name from t_encrypt_2;
ERROR 1708 (HY000): [10.0.2.202:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: (GBA-01EX-700) Gbase general error: Decrypt key invalid.
SQL: SELECT /*::ffff:10.0.2.201_8_26_2020-12-04_15:52:48*/ /*+ TID('3538983') */ `testdb.t_encrypt_2`.`name` AS `name` FROM `testdb`.`t_encrypt_2_n1` `testdb.t_encrypt_2`
gbase>

注意

老版本里(9.5.2.44之前)

不要使用加密功能。

整表加密,也就是在表属性上使用encrypt,在,只是在创建时的列全部加密。如果后续有增加列,如果不写加密属性,默认还是不加密的。

警告:在老版本里,如果你在加密表增加了一个不带加密属性的列,会导致【扩容】【节点替换】时这类表主副本表结构不一致而无法同步数据,因为新节点的建表语句,是表上带加密属性的,自动会给所有列带加密属性。【强烈建议使用加密的项目,升级到新版本】

gbase> create table t_encrypt2(id int,name varchar(100))encrypt;
Query OK, 0 rows affected (Elapsed: 00:00:00.09)

gbase> show create table t_encrypt2;
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                             |
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_encrypt2 | CREATE TABLE "t_encrypt2" (
  "id" int(11) DEFAULT NULL ENCRYPT ,
  "name" varchar(100) DEFAULT NULL ENCRYPT
) ENCRYPT  ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> alter table t_encrypt2 add birth date;
Query OK, 0 rows affected (Elapsed: 00:00:00.12)
Records: 0  Duplicates: 0  Warnings: 0

gbase> show create table t_encrypt2;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                          |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_encrypt2 | CREATE TABLE "t_encrypt2" (
  "id" int(11) DEFAULT NULL ENCRYPT ,
  "name" varchar(100) DEFAULT NULL ENCRYPT ,
  "birth" date DEFAULT NULL
) ENCRYPT  ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> insert into "t_encrypt2" values (1,'first','2020-01-01');
ERROR 1705 (HY000): gcluster DML error: No successful nodes, (GBA-01EX-700) Gbase general error: Encrypt key invalid.

gbase> insert into "t_encrypt2" (birth) values ('2020-01-01');
Query OK, 1 row affected (Elapsed: 00:00:00.05)

gbase> select * from t_encrypt2;
+------+------+------------+
| id   | name | birth      |
+------+------+------------+
| NULL | NULL | 2020-01-01 |
+------+------+------------+
1 row in set (Elapsed: 00:00:00.01)

需要加密列时,指定列的encrypt属性。

gbase> alter table t_encrypt2 add birth2 date encrypt;
Query OK, 1 row affected (Elapsed: 00:00:00.14)
Records: 1  Duplicates: 1  Warnings: 0

gbase> show create table t_encrypt2;
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                                                                 |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_encrypt2 | CREATE TABLE "t_encrypt2" (
  "id" int(11) DEFAULT NULL ENCRYPT ,
  "name" varchar(100) DEFAULT NULL ENCRYPT ,
  "birth" date DEFAULT NULL,
  "birth2" date DEFAULT NULL ENCRYPT
) ENCRYPT  ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.01)

gbase> insert into "t_encrypt2" (birth2) values ('2020-01-01');
ERROR 1705 (HY000): gcluster DML error: No successful nodes, (GBA-01EX-700) Gbase general error: Encrypt key invalid.
gbase>

新版本(9.5.2.44及之后)

根据实际使用情况,如果整表加密,在内部的列自动加密,无论是否有encryt属性,包括新增加的列。如下例子可以看到,新增加的name列没设置encrypt属性,但查看表结构,自动继承了表的加密属性。也就是说,整表加密,不再支持某些列不加密的特例了。如果有这个需求,建表时,只在需要的列上有加密属性,不要在表上。

[gbase@gbase_rh7_001 gcinstall_9.5.2.44.2]$ gccli testdb

GBase client 9.5.2.44.283f8db1. Copyright (c) 2004-2022, GBase.  All Rights Reserved.

gbase> create table e1(id int)encrypt;
Query OK, 0 rows affected (Elapsed: 00:00:00.21)

gbase> show create table e1;
+-------+-------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                        |
+-------+-------------------------------------------------------------------------------------------------------------------------------------+
| e1    | CREATE TABLE "e1" (
  "id" int(11) DEFAULT NULL ENCRYPT
) ENCRYPT  ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+-------+-------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> alter table e1 add column name varchar(100);
Query OK, 0 rows affected (Elapsed: 00:00:00.27)
Records: 0  Duplicates: 0  Warnings: 0

gbase> show create table e1;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                     |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| e1    | CREATE TABLE "e1" (
  "id" int(11) DEFAULT NULL ENCRYPT ,
  "name" varchar(100) DEFAULT NULL ENCRYPT
) ENCRYPT  ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)

性能损失

根据公司测试,加密算法本身性能下降接近300%,也就是单纯从磁盘读取数据,对比读取数据后解密。

在实际业务中,需要考虑磁盘读取部分,在整个业务中占用的比例,还要考虑冷热数据和缓冲等影响。同时,在有非加密列参与的业务,需要考虑到加密列所占比例,比例越小影响越小。

性能影响 = 磁盘部分所占比例 * 加密列在所有参与计算列的比例。

  • 如果数据少而计算量大,比如大量的group,OLAP计算,JOIN等,则整体性能下降就较少,一般在5-10%
  • 最差的情况,比如【冷数据】,无缓存,简单的select *,将下降300%
  • 泛泛估算,可以考虑在10-20%之间,包括加载。

数据膨胀

无膨胀。