深入理解Mysql系列——行存储和列存储详解

行存储

数据一行一行存储,实际存在磁盘上是一块一块的存储,每行的长度不一定相同。举个例子,按mysql的存储设计,数据是按行排列到磁盘中的,比如第1行的全部字段用/分开,连续写入到磁盘中,"1/猪肉/肉类/50/2.0/2020.01.01"在order.idb文件中的offset范围为1201~1250。当用户需要查找第1笔订单的价格,语句为"select price from table where orderid=1",mysql必须把offset1201~1250都从磁盘中读取出来,再从中挑选出price=50这个字段值返回。

第一个场景:假设从1g行中选出100001-200000行,行存储会怎么做呢

从基本连续的空间取出10w行,因为数据基本在连续的空间中。因为有页表,所以读取内存的值往往是2k,4k这样的值,导致磁盘一块读入内存中也是2k,4k,所以一个块的大小往往和2k,4k这样的数字有关系

 

第二个场景:假设从1g行中 取出1列数据100001-200000行的name,status列

怎么从10w行的结果集中再取出两列,可以筛选后再复制,也可以分批次读取少量行然后取得时候就选出需要的列。

无论什么算法,数据必须得通过一个buffer,然后存在buffer里去计算,如果buffer为4M,那就得256次读取 ,读4M过滤一些列处理。。。这样就是做10w次过滤操作。这是行存储的基本逻辑。

行存储在数据量不多时,看起来并没有什么问题。

假设我们换个场景思考,我们是做电商的,每年产生1000亿条订单,每条订单有50种属性(50个字段),我们的分析师需要分析商品的平均价格,这个时候如果用mysql,就需要把1000亿条全部50个字段数据都从磁盘读取,但是只取了其中price字段使用,因为多读取了49个字段的无用数据,磁盘和内存都会成为性能瓶颈,这个操作非常低效非常慢。这个时候,就需要引入列存储的概念了。
 

列存储

数据一列一列的存,某一种属性就存储一列。一列中的数据在存储介质中以连续存储形式存在。

逻辑上是列存储,实际上还是一行一行的存储,比如id列的第一行和name列的第一行实际还是在一行上的。

行式数据库的特性如下:


①数据是按行存储的。

②没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率。

③建立索引和物化视图需要花费大量的时间和资源。

④面对查询需求,数据库必须被大量膨胀才能满足需求。

列式数据库的特性如下:


①数据按列存储,即每一列单独存放。

②数据即索引。

③只访问查询涉及的列,可以大量降低系统I/O。

④每一列由一个线程来处理,即查询的并发处理性能高。

⑤数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗。
 

那么Mysql是行式存储还是列式存储?

Mysql作为一个关系型数据库,结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行数据,特点为:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。因此关系型数据库完美契合结构化数据的特点。

所以Mysql是行存储。MySQL是基于磁盘进行数据存储的关系型数据库, 所有的数据、索引等数据均以磁盘文件的方式存储, 在有需要时载入内存读取。

原文链接:https://blog.csdn.net/daiyudong2020/article/details/104665885

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值