Decimal类型设计方法

由于数据库和列存储系统中十进制类型的设计差异,这个问题变得复杂。
坦白说,MySQL和ApacheArrow的设计侧重点不同。
下面我就来详细说说它们。

我们先来说说最重要的一点,就是MySQL中小数类型的设计。
MySQL中,decimal类型的数据结构是通过decimal_t来实现的,它有几个关键字段:intg代表整数部分的位数,frac代表小数部分的位数,len固定为9 ,也就是说最多可以存储9 个decimal_digit_t(即int3 2 ),这是MySQL中decimal类型的上限。
签名是符号位,buf是一个decimal_digit_t数组,用于存储实际值。
我们去年跑的项目大概有3 000条数据,MySQL的十进制类型存储效率非常好。

还有一点是MySQL的设计优势在于它的精确表示。
整数和小数部分分开存储,以及对每个小数位的精确控制,保证了数据的准确性。
此外,整数部分和尾数部分的一致存储有助于加快加法和减法运算。

一开始我以为MySQL的设计是最优的,后来发现是错误的。
等等,还有一件事,ApacheArrow 的十进制类型设计也很有趣。
ApacheArrow的设计更加注重轻量级表示和高效处理。
其十进制类型包括Decimal1 2 8 和Decimal2 5 6 ,这两个类型都是基于GenericBasicDecimal类实现的子类。
例如,Decimal1 2 8 实际上是一个长度为2 的uint6 4 _t数组,有效位数为3 8 位。
这样的设计是,Arrow的decimal类型只存储当前的小数值和有效位数的总数,而不存储整数和小数的具体个数。

很多人没有注意到这一点。
Arrow设计在处理加法、减法、大小比较等需要小数点对齐的场景时,会根据字段属性动态计算实际的小数值。
这种动态计算方式虽然在某些情况下不如MySQL直接存储那么准确,但在轻量级表示和高效处理方面具有很大优势。

我认为根据自己的具体应用场景和需求来选择小数类型设计是值得尝试的。
如果需要精确表示和高效运算,MySQL十进制类型可能更合适;如果作用温和且治疗有效是必需的,Apache Arrow 的十进制类型可能更有用。
请记住,选择正确的十进制类型设计可以极大地提高系统性能和存储效率。

MySQL如何在一个字段中包含多个值mysql一个字段包含

抱歉,MySQL 存储多个值存在很多问题。
我们不得不说两种常见的方法,一种是使用逗号分隔符,另一种是使用JSON格式。

我们先来说说逗号分隔符。
这个方法很简单,就像我们平时做笔记一样,用逗号分隔标记,保存在一个字段中。
例如,有一个“文章”表,存储文章 ID、标题和标签。
label字段使用VARCHAR类型,可以存储很长的字符串。
我们可以这样插入数据:
sql 创建表文章 ( INT(1 1 )不为空AUTO_INCRMENT, VARCHAR(2 5 5 ) 地址不为空, VARCHAR(2 5 5 ) 标签不为空, 主键(id) );
插入文章(标题、标签)值(“文章 1 ”、“技术、编程”); 插入文章(标题、标签)值(“文章2 ”、“技术、Web 开发”); 插入文章(标题、标签)值(“文章 3 ”、“编程、Web 开发”);
接下来,如果我们想检查所有包含“programming”标签的文章,我们可以编写如下查询:
sql 从带有“%programming%”等标签的文章中进行选择;
这个查询将找到第 1 条和第 3 条。

我们来谈谈 JSON 格式。
这种方法在MySQL 5 .7 及更高版本中非常流行。
我们仍然使用 Articles 表,但这次标签字段使用 JSON 类型。
这样标签就可以以矩阵形式存储。
插入数据时,必须将标签写成JSON:
sql数组 创建表文章 ( INT(1 1 )不为空AUTO_INCRMENT, VARCHAR(2 5 5 ) 地址不为空, JSON 标签不为空, 主键(id) );
INSERT INTO ARTICLES (标题、标签) VALUES ('文章 1 ', '[\"技术\",\"编程\"]'); INSERT INTO ARTICLES (标题、标签) VALUES ("第 2 条", '[\"技术\",\"Web 开发\"]'); INSERT INTO ARTICLES (标题、标签) VALUES ("Article 3 ", '[\"Programming\",\"Web Development\"]');
要搜索标记为“编程”的文章,我们使用 JSON 函数 JSON_CONTAINS:
sql 从文章中选择 JSON_CONTAINS(tags, '\"programming\"');
此查询还会查找第 1 条和第 3 条。

两种方法各有优缺点。
逗号分隔符虽然简单,但是查询和修改比较麻烦,而且类型不安全。
JSON格式查询友好、类型安全,并且具有良好的可扩展性。
不过说实话,我当时并不知道该用哪一个。
这取决于具体需求。

如果如果您使用的是MySQL 5 .7 及更高版本,我个人建议使用JSON格式。
毕竟这东西方便,以后也容易扩展。

数据库 只几种 存储 方式

上周,一位客户问我如何选择数据库。
我给他做了初步指示,主要考虑这四个方面。
你认为这有道理吗:
1 存储结构。
想一想,哪个场景对你来说最重要?
HEAP:可以操作临时数据,例如会话管理,但断电后就会消失。
这谁能受得了?
我在2 02 3 年上海的一个购物中心项目中使用过,用户的登录状态很快就保存在内存中,但是第二天就无法打开查看昨天有谁访问过。

B+TREE:最流行的类型,如MySQL InnoDB,数据以树形结构排列,检查数据范围非常快。

这就是我在 2 02 2 年选择的电子商务后端。
检查用户订单的范围(例如给定月份的所有订单)将实时进行。

COLUMN-STORE:专用于数据存储,按列存储,使分析查询的效率提高一倍(比如检查所有用户的总年龄)。

去年接触ClickHouse,每天的性能统计比传统MySQL快不了半点。

LSM-TREE:一种用于多写、少读脚本的工具,例如日志。
我在 2 02 1 年一直在调试 LevelDB,在后台合并数据真的很轻松。

HASH:像Redis哈希表一样,检查某个键值很快,但你想检查“3 0岁以上的用户”?别开玩笑了。

2 关系和非关系 这是一个陈词滥调:
关系型(MySQL/Oracle):严格的数据结构,但 ACID 事务可以挽救生命!
我将在 2 02 1 年接管旧系统,这都是相关的。
要更改数据,您必须重新组织事务,并且不能阻止整个站点。

非关系型(Redis/MongoDB):灵活!你可以想存多少就存多少,但可扩展性会立即达到极限。

某外卖平台将在2 02 2 年将整个订单表迁移到MongoDB,并水平扩展部分节点以应对双十一。

3 如何保存数据结构 这取决于底层实现:
顺序存储:像数组一样,访问速度快,但是在中间插入数据时,必须移动大量数据。
是不是不舒服?
链式存储:适合数据移动,但您必须首先寻找它,例如排列一个类来报告数字。

索引存储:这种类型的B+树查找速度快,但占用空间较大,需要较多的维护。

哈希存储:哈希表,查找速度非常快但必须处理问题,比如突然在队列中发现两个人的名字。

4 硬件架构 这取决于你有多少钱:
DAS:服务器已连接直接连接硬盘,价格便宜,但不能共享数据。
是分布式的吗?没有机会。

为了避免麻烦,我在 2 02 2 年使用 DAS 构建了一个独立系统,但后来当我想添加从数据库时它崩溃了。

NAS/SAN:可共享,但价格昂贵。

某大厂将在2 02 3 年更换NAS,声称现在数据迁移方便多了,但成本吓人。

最后,说实话。

MySQL InnoDB:稳定如老狗,具有出色的事务支持,适合万无一失的金融系统。

ClickHouse:数据仓库首选,但调优是个技术活。
如果运行缓慢,你会去找谁?
Redis:简单的缓存+查询,但别把它当关系型数据库用,你会哭的。

使用什么取决于你的情况,不要只是追随潮流。
比如想要密集写入就用LSM,想要更密集写入就用B+树。
如果你钱多,要求高,可以改用分布式存储。
无论如何,我遇到的陷阱是我最终使用了错误的存储结构,以后更改它比构建新系统更困难。

数据库存数组用什么类型的数据