Oceanbase部分参数学习与验证

发布时间 2023-12-18 10:18:30作者: 济南小老虎

Oceanbase部分参数学习与验证


字符集等参数查看

yum install obclient -y
然后使用客户端连接:
obclient -h172.24.110.175 -P2881 -uroot -p'Testxxxx' -Doceanbase -A

mysql方式连接:
mysql -h127.0.0.1 -P2881 -pTestxxxx

# 查看字符集:
mysql> show variables like '%character%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8mb4 |
+--------------------------+---------+
7 rows in set (0.00 sec)

# 版本查看
mysql> SELECT @@version;
+--------------------+
| @@version          |
+--------------------+
| 3.1.3-OceanBase CE |
+--------------------+
1 row in set (0.00 sec)


大表创建情况

先验证一下大于MySQL的表是可以创建的: 

[root@amd9t34 setup]# mysql -h127.0.0.1 -P2881 -pTestxxxx -A
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3221487924
Server version: 5.7.25 OceanBase 3.1.3 (r10100042022051821-a09d3134c10665f03fd56d7f8bdd413b2b771977) (Built May 18 2022 21:42:24)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use xxxx
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table zhaobshbigtable (zhaobsh1 varchar(10000),zhaobsh2 varchar(10000),zhaobsh3 varchar(10000),zhaobsh4 varchar(10000),zhaobsh5 varchar(10000),zhaobsh6 varchar(10000),zhaobsh7 varchar(10000),zhaobsh8 varchar(10000),zhaobsh9 varchar(10000),zhaobsh10 varchar(10000)) ;
Query OK, 0 rows affected (0.02 sec)

列数限制确认

脚本创建表的create 语句 
for i in {1..1000} ; do echo -n "zhaobsh${i} varchar(100),"; done

进入mysql客户端进行验证:
512个列时提示: 

zhaobsh512 varchar(100));
ERROR 1117 (42000): Too many columns

511个列时可以创建
zhaobsh511 varchar(100));
Query OK, 0 rows affected (0.09 sec)

怀疑数据库里面应该有一个 rowid的隐藏列
所以加上这个隐藏列也就符合了 Oceanbase说的 512个列的限制条件了. 

数据库模式确认

mysql> show variables like "%mode";
+-----------------------------+-------------------+
| Variable_name               | Value             |
+-----------------------------+-------------------+
| block_encryption_mode       | aes-128-ecb       |
| ob_compatibility_mode       | MYSQL             |
| ob_create_table_strict_mode | OFF               |
| sql_mode                    | STRICT_ALL_TABLES |
+-----------------------------+-------------------+
4 rows in set (0.00 sec)

窗口函数验证

create table class(id int,classname int,grade int);
insert into class values(1,1,86),(2,1,95),(3,2,89),(4,1,83),(5,2,86),(6,3,92),(7,3,86),(8,1,88);

每个班的成绩进行排名:
select *,rank() over (partition by classname order by grade desc) as ranking from class;

排名
select *,rank() over (order by grade desc) as ranking, dense_rank() over (order by grade desc) as dense_ranking, row_number() over (order by grade desc) as row_num from class;

取出所有学生中成绩排名前三的学生
select a.classname,a.id,a.grade,a.rownum from (select id,classname,grade,row_number() over (order by grade desc) as rownum from class) as a inner join class as b on a.id=b.id where a.rownum<=3 order by a.rownum ;

每门课程中取成绩排名前2的学生:
也就是每门课程中都要取出两名学生
select a.classname,a.id,a.grade,a.rownum from (select id,classname,grade,row_number() over (partition by classname order by grade desc) as rownum from class) as a inner join class as b on a.id=b.id where a.rownum<=2 order by a.classname ;

知识来源:
https://zhuanlan.zhihu.com/p/164698823

部分窗口函数应该是支持的. 问题应该不大. 

最大行长度验证

MySQL的数据库最大行长度是一个很恶心的 64k/字符集单个字节 占用数限制

发现Oceanbase的宣称支持到了1.5M 也就是 mysql默认值的 24倍,

这里也进行一下验证: 
发现的确可以创建
393216 长度的单表
并且在393217的时候报错了.

创建大小的公式为 1.5*1024*1024/4 

因为Oceanbase 默认支持的是 utf8mb4 不支持比较差的utf8mb3字符集

mysql> create table zhaobsh9 (zhaobsh1 varchar(10000),zhaobsh2 varchar(10000),zhaobsh3 varchar(10000),zhaobsh4 varchar(10000),zhaobsh5 varchar(10000),zhaobsh6 varchar(10000),zhaobsh7 varchar(10000),zhaobsh8 varchar(10000),zhaobsh9 varchar(10000),zhaobsh10 varchar(10000),zhaobsh11 varchar(10000),zhaobsh12 varchar(10000),zhaobsh13 varchar(10000),zhaobsh14 varchar(10000),zhaobsh15 varchar(10000),zhaobsh16 varchar(10000),zhaobsh17 varchar(10000),zhaobsh18 varchar(10000),zhaobsh19 varchar(10000),zhaobsh20 varchar(10000),zhaobsh21 varchar(10000),zhaobsh22 varchar(10000),zhaobsh23 varchar(10000),zhaobsh24 varchar(10000),zhaobsh25 varchar(10000),zhaobsh26 varchar(10000),zhaobsh27 varchar(10000),zhaobsh28 varchar(10000),zhaobsh29 varchar(10000),zhaobsh30 varchar(10000),zhaobsh31 varchar(10000),zhaobsh32 varchar(10000),zhaobsh33 varchar(10000),zhaobsh34 varchar(10000),zhaobsh35 varchar(10000),zhaobsh36 varchar(10000),zhaobsh37 varchar(10000),zhaobsh38 varchar(10000),zhaobsh39 varchar(10000),zhaobsh40 varchar(3216)) ;
Query OK, 0 rows affected (0.02 sec)

mysql> create table zhaobsh10 (zhaobsh1 varchar(10000),zhaobsh2 varchar(10000),zhaobsh3 varchar(10000),zhaobsh4 varchar(10000),zhaobsh5 varchar(10000),zhaobsh6 varchar(10000),zhaobsh7 varchar(10000),zhaobsh8 varchar(10000),zhaobsh9 varchar(10000),zhaobsh10 varchar(10000),zhaobsh11 varchar(10000),zhaobsh12 varchar(10000),zhaobsh13 varchar(10000),zhaobsh14 varchar(10000),zhaobsh15 varchar(10000),zhaobsh16 varchar(10000),zhaobsh17 varchar(10000),zhaobsh18 varchar(10000),zhaobsh19 varchar(10000),zhaobsh20 varchar(10000),zhaobsh21 varchar(10000),zhaobsh22 varchar(10000),zhaobsh23 varchar(10000),zhaobsh24 varchar(10000),zhaobsh25 varchar(10000),zhaobsh26 varchar(10000),zhaobsh27 varchar(10000),zhaobsh28 varchar(10000),zhaobsh29 varchar(10000),zhaobsh30 varchar(10000),zhaobsh31 varchar(10000),zhaobsh32 varchar(10000),zhaobsh33 varchar(10000),zhaobsh34 varchar(10000),zhaobsh35 varchar(10000),zhaobsh36 varchar(10000),zhaobsh37 varchar(10000),zhaobsh38 varchar(10000),zhaobsh39 varchar(10000),zhaobsh40 varchar(3217)) ;
ERROR 1118 (42000): Row size too large
mysql>