什么是列式存储?
大家好,我是连边,这是我的第36
篇原创文章。
今天这篇文章从一个简单的表格开始来给大家讲列式存储。
还是老规矩,先上导读图,然后开始~
从一个表格说起
要讲列式存储,首先要讲表格,我们平常统计数据用Excel,就是最常见的表格。
如下表格,我们统计了学生的基本信息:
学号 | 姓名 | 性别 | 成绩 |
---|---|---|---|
001 | 张三 | 男 | 60 |
002 | 李四 | 男 | 70 |
003 | 王五 | 男 | 80 |
行、列组成了我们看到的表格。而我们说的列式存储,是与行式存储是相对而言的。
除开表头(学号、姓名、性别、成绩)这一行,我们看其他的三行数据。假如现在我说:“我们要把学生的基础信息以行来分开保存到记事本里边”,你下意识的会不会这么做?
复制、粘贴第一行保存为记事本 《张三.txt》
001 | 张三 | 男 | 60 |
---|
复制、粘贴第二行保存到记事本 《李四.txt》
002 | 李四 | 男 | 70 |
---|
复制、粘贴第三行保存到记事本 《王五.txt》
003 | 王五 | 男 | 80 |
---|
其实你这个下意识的存储方式,就是我们的行式存储。
抽象成存储的数据结构,可以长这样子:
而我们今天的主角,列式存储会是什么样子呢?相信你也非常清楚了吧?
复制、粘贴第一列保存到记事本 《学号.txt》
学号 |
---|
001 |
002 |
003 |
复制、粘贴第一列保存到记事本 《姓名.txt》
姓名 |
---|
张三 |
李四 |
王五 |
复制、粘贴第一列保存到记事本 《性别.txt》
性别 |
---|
男 |
男 |
男 |
复制、粘贴第一列保存到记事本 《成绩.txt》
成绩 |
---|
60 |
70 |
80 |
抽象成存储的数据结构,可以长这样子:
优势
上边如果弄清楚了,我们再来聊一聊为什么列式存储会突然出现在我们面前?相比我们的行式存储,它有什么优势呢?
其实从马云早些年喊出大数据是将来的石油开始,可见大数据在很多公司的地位,一些中小型公司也慢慢的重视起客户的数据分析一系列举措来提高成交量,数字化成为很多公司的战略。
而大数据、数字化这些战略的背后,我们就需要有大数据的存储容器,即数据库。
最开始,我们会一股脑的放在我们的MySQL里边,但是随着时间的推移,数据量越来越大,会发现很多统计查询会越来越慢,最后查询分析数据的速度,满足不了业务的需求了。
怎么办?查询慢,赶快建索引啊!
还不行又怎么办?彻底分析需求,还是得从数据结构上想办法。
需求:求平均成绩
计算方式:(60+70+80)/3 = 70
SQL:
1 |
|
还是以上边的表格来说,如果我是行式存储,就是存储三个文件《张三.txt》、《李四.txt》、《王五.txt》,如果要拿出他们各自的成绩,我需要对他们三个文件去进行文件打开、获取成绩、文件关闭;获取到分别的成绩之后,然后进行平均值计算,这就消耗了三次IO。
而如果我们以列式存储的呢?我是要求成绩
这一列的平均值,我直接从《成绩.txt》这个文件里边拿出数据,再计算平均值就好了。
感觉到他们的优势了吗?
这也是列式存储的(最大)优势,即:
快速读取特定列。
如果从事大数据分析行业的朋友,想想你的一些需求,是不是大多数都是计算某列数据的值?
继续讲列式存储的另外一个好处,连续的空间利于算法压缩
因为列式存储将同一列的数据存储在一起,所以使用压缩算法可以得到更高的压缩率,减少存储占用的磁盘空间。压缩算法的基本原理其实很简单,它使用基于特定规则的数据表示原数据,如下所示的字符串中包含连续的相同字符,我们使用最符合直觉的压缩算法就可以减少字符串的长度:
以上就是把“男男男“,存储成了”男3“,表示重复的”男“这个字符,有3个。同理,如果我们数据量大了,有很多分数相同的,也可以进行同样的压缩。
不是银弹
列式存储也并非银弹(比喻什么问题都能解决的方式方法),也有他的缺点。
我们开动脑筋的想一想,我举一个例子:
列式存储是连续空间,连续空间就和我们的数组结构一样,虽然查询的速度是快了,但是修改(增删改)的速度就要各种挪动元素了。
总结
从一个简单的表格出发,讲了行式存储和列式存储,最后推出了列式存储的两个优点:
- 快速读取特定列;
- 连续的空间利于算法压缩;
然后也说了,列式存储并非银弹,只是在不同的诉求下,有不同的方案取舍。
推荐文章: