我们在做一个开源的数据库客户端,要把行数和体积这类读数显示在界面上。同一套读法接到四个国产库上,结果四个样。下面是实测记录,包括两处我们自己写错的地方。
先说一句结论: 这四个库里,没有一个在刚写完数据的时候能马上给你正确的行数。 但它们不给的方式完全不同,误判成「工具不支持」很容易。
| 库 |
version() 返回 |
实际版本 |
|---|---|---|
| TiDB | 8.0.11-TiDB-v8.5.1 | 同左 |
| OceanBase CE | 5.7.25-OceanBase_CE-v4.4.2.1 | 4.4.2 |
| StarRocks | 5.1.0(虚构的) | 3.3.22-753696f |
| Apache Doris | 5.7.99 | 4.1.3-rc02 |
StarRocks 这一条值得单独拎出来:
version() 返回的
MySQL 5.1.0 是个不存在的版本,真实构建号只在
current_version() 里。如果你的工具按
version() 做能力判断,会把它当成十几年前的 MySQL 来对待。
TiDB —— 刚灌完数据读 0 行 0 B,不用管它,后台统计追上之后自己就对了。不需要
ANALYZE。
Doris —— 表现和 TiDB 一样是自愈的,但中间我们绕了弯路:插完 2000 行立刻读是 0 行 0 B,我们手动跑了一句
ANALYZE TABLE ... WITH SYNC,
没有任何效果;大约一分钟后数字自己出现了。所以那句 ANALYZE 是白跑的。
StarRocks —— 同样要等后台收集器,但等待时间差得离谱:同一张 5 行的表,在 4.1.4 上等了 45 秒,在 3.3.22 上等了大约 4 分半。中间这段时间界面上就是 0。
OceanBase —— 不自愈,必须手动
ANALYZE TABLE,跑完之后 2000 就是 2000。而且
只能用 MySQL 模式的写法,Oracle 模式那句会被直接拒:
ANALYZE TABLE t COMPUTE STATISTICS; → ERROR 1235
这是 StarRocks 和 Doris 分道扬镳的地方——StarRocks 是 Doris 的分支,但在这件事上不一样。
Doris 的数字是对的:对象面读到 2000 行 / 9.95 KB,
SELECT count(*) 的真值就是 2000;表统计读到 10187 字节,
SHOW DATA 给的是 9.948 KB。两边能对上。
StarRocks 读到的是硬零。
OceanBase 也是零——
information_schema.TABLES 里
DATA_LENGTH 和
INDEX_LENGTH 都是 0,表、索引、库、存储四个地方全是 0 B。
另外 OceanBase 和 TiDB 有个共同的小坑:
存储统计里会冒出一行
InnoDB。OceanBase 那行写的是
ibdata1:12M:autoextend,大小读数是 N/A——它为了兼容伪造了
innodb_data_file_path 这个变量,后面并没有这个文件。第一次看到会以为自己解析错了。
第一处,
SHOW STATUS LIKE。 概览和健康两个面板原来发的是
SHOW STATUS LIKE '...',在 Doris 的语法里这是个解析错误:
mismatched input 'LIKE'
而不带 LIKE 的裸
SHOW STATUS 是接受的,只是返回零行。两个面板就这么挂了一段时间,我们一开始归到「Doris 不支持」上,其实是我们发错了语句。
第二处,被 NULL 毒化的求和。 StarRocks 的
INDEX_LENGTH 是
NULL,而 Doris 的同一列是实打实的 0。我们在 SQL 里对这两列做 SUM,NULL 把整个和变成了 NULL,于是 StarRocks 的体积永远读 0——不是它先报零我们跟着零,是我们自己把能读到的那部分也弄没了。改成对 NULL 取 0 之后这一段才正常。
这两件事的教训是一样的: 引擎返回「读不到」和引擎返回「就是 0」,在界面上必须长得不一样。 混在一起显示,排查的人会去查错方向。
max_connections 读到 0,那是它的默认值,意思是不限制,不是坏了。
SHOW STATUS 返回 13 行,里面没有
Threads_connected,所以连接数只能显示「未发布」。慢查询面板永远是空的——它的慢日志在
information_schema.SLOW_QUERY 里。Uptime,不发布
Threads_connected,也没有
max_connections 变量。所以这三个位置只能写「N/A,未发布」,写 0 就是编数字。information_schema.PROCESSLIST(*Unknown table*),会话面板和健康检查都卡在这一张表上。performance_schema 这个库(
ERROR 1049),健康检查过不去。information_schema.TABLES 还有别的读法吗?ANALYZE TABLE ... WITH SYNC 在什么情况下才真的同步?我们那次跑了等于没跑。上面每条都是在文中标注的那个版本上跑出来的,版本换了结论可能就不一样。各位如果在别的版本上读到不同的数,很想知道。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70051429/viewspace-3183533/ ,如需转载,请注明出处,否则将追究法律责任。