卖房小狼人 發表於 2023-11-4 00:00:00

面试 | 面向行的数据库VS面向列的数据库

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>
        总览<ul class="second_class_ul"><li>
        <strong>面向行(事务型) 数据库</strong>
</li></ul></li><li>
        <strong>面向列(分析型) 数据库:</strong>
<ul class="second_class_ul"><li>
        常用的面向列的数据库</li></ul></li><li>
        面向行的数据库<ul class="second_class_ul"><li>
        读取面向行的数据库</li></ul></li><li>
        面向列的数据库<ul class="second_class_ul"><li>
        写入面向列的数据库</li><li>
        从面向列的数据库中读取</li></ul></li><li>
        附录(SQL知识大图)<ul class="second_class_ul"></ul></li></ul></div><p>
        <img title="面试 | 面向行的数据库VS面向列的数据库" alt="面试 | 面向行的数据库VS面向列的数据库" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/1383b4c4e3381decb8f8dd9fef31a673.jpg" width="auto"></p>

<p class="maodian"></p><h2>
        总览</h2>
<p>
        数据库的数据存储有两种类型,一种是面向行的(row-oriented)数据库,另一种是面向列的(column-oriented )数据库。</p>
<p class="maodian"></p><h3>
        <strong>面向行(事务型) 数据库</strong>
</h3>
<p>
        该类数据库是根据记录(record)组织数据的,将所有与记录相关联的数据保存在内存中。面向行的数据库是组织数据的传统方式,并且为快速存储数据提供了一些关键优势。它们经过优化,可以高效地读取和写入行。</p>
<p>
        <strong>常见的面向行的数据库:</strong></p>
<ul>
<li>
                PostgreSQL</li>
        <li>
                MySQL</li>
</ul>
<p>
        <strong>优点</strong></p>
<ul>
<li>
                行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性;</li>
        <li>
                insert/update更容易</li>
</ul>
<p>
        <strong>缺点</strong></p>
<ul>
<li>
                没有索引的查询会产生大量的I/O</li>
        <li>
                建立索引需要花费大量时间和资源</li>
        <li>
                面对查询的需求,数据库必须被大量膨胀才能满足性能的需求</li>
</ul>
<p class="maodian"></p><h2>
        <strong>面向列(分析型) 数据库:</strong>
</h2>
<p>
        该类数据库是按字段组织数据的,在内存中将所有与字段相关联的数据保存在一起。该类数据库在读取和计算列有明显的优势。</p>
<p class="maodian"></p><h3>
        常用的面向列的数据库</h3>
<ul>
<li>
                AWS RedShift</li>
        <li>
                Google BigQuery</li>
        <li>
                HBase</li>
</ul>
<p>
        <strong>优点</strong></p>
<ul>
<li>
                只查询涉及的列,会大量降低系统I/O,适合并发查询</li>
        <li>
                数据类型一致,数据特征相似,能对数据进行高效压缩</li>
        <li>
                非常适合做聚合操作</li>
</ul>
<p>
        <strong>缺点</strong></p>
<ul>
<li>
                缺乏数据完整性保证,写入效率低</li>
        <li>
                不适合频繁delete/update操作</li>
</ul>
<p class="maodian"></p><h2>
        面向行的数据库</h2>
<p>
        传统的关系型数据库管理系统(DBMS)都是面向行的。在行存储或面向行的数据库中,数据是逐行存储的,这样,行的第一列将挨着前一行的最后一列。</p>
<p>
        比如,有下面的一张表</p>
<p>
        <img title="面试 | 面向行的数据库VS面向列的数据库" alt="面试 | 面向行的数据库VS面向列的数据库" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/d63deb878b97693d1fdb99d61f3fc82b.jpg" width="auto"></p>
<p>
        这些数据将被存储在一个面向行的数据库中的一个磁盘上,按照下面这样的顺序一行一行的排列:</p>
<p>
        <img title="面试 | 面向行的数据库VS面向列的数据库" alt="面试 | 面向行的数据库VS面向列的数据库" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/7ede70d4cdfc28b08e6af6bc5532b441.jpg" width="auto"></p>
<p>
        <img title="面试 | 面向行的数据库VS面向列的数据库" alt="面试 | 面向行的数据库VS面向列的数据库" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/03234eced3cb331f62eafd26f8688767.jpg" width="auto"></p>
<p>
        这允许数据库快速写入一行,因为要写入数据,只需在数据的末尾添加另一行即可。</p>
<p>
        面向行的数据库仍然通常用于联机事务处理(OLTP)的应用程序,因为它们可以很好地管理对数据库的写操作。对于联机分析处理(OLAP)的场景需要一个支持特定数据查询的数据库。这就是面向行的数据库比面向列的数据库慢的地方。</p>
<p class="maodian"></p><h3>
        读取面向行的数据库</h3>
<p>
        面向行的数据库检索行或一组行的速度很快,但在执行聚合时,它将额外的数据(列)带入内存,这比只选择要执行聚合的列要慢。此外,面向行的数据库可能需要访问的磁盘数量通常更多。</p>
<p>
        因此,我们可以看到,虽然向面向行的数据库添加数据是快速和简单的,但从中获取数据可能需要使用额外的内存和访问多个磁盘。</p>

<p class="maodian"></p><h2>
        面向列的数据库</h2>
<p>
        数据仓库的创建是为了支持数据分析。这些类型的数据库通常对数据读取做了优化。</p>
<p>
        在面向列的数据库中,数据的存储形式为列中的每一行都挨着同一列中的其他行。</p>
<p>
        仍然以上面的表为例:</p>
<p>
        <img title="面试 | 面向行的数据库VS面向列的数据库" alt="面试 | 面向行的数据库VS面向列的数据库" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/68aa3b7f831c29e9867a9bf880236a47.jpg" width="auto"></p>
<p>
        一个表一次存储一列,按照一行一行的顺序排列:</p>
<p>
        <img title="面试 | 面向行的数据库VS面向列的数据库" alt="面试 | 面向行的数据库VS面向列的数据库" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/676c68c7e0eb96a188cfd26178c294d1.jpg" width="auto"></p>
<p>
        <img title="面试 | 面向行的数据库VS面向列的数据库" alt="面试 | 面向行的数据库VS面向列的数据库" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/d5a0b1fedb06fcaa6c6e975f162b508d.jpg" width="auto"></p>
<p class="maodian"></p><h3>
        写入面向列的数据库</h3>
<p>
        如果我们想要添加一个新记录,必须先定位数据的位置(比如HBASE的三级寻址),将每一列插入到它应该在的位置。</p>
<p>
        如果数据存储在一个单独的磁盘上,那么它将有与面向行的数据库相同的额外内存问题,因为它需要将所有内容都放入内存中。但是,当存储在单独的磁盘上时,面向列的数据库将有很大的好处。</p>
<p class="maodian"></p><h3>
        从面向列的数据库中读取</h3>
<p>
        只需要计算需要的列,减少磁盘扫描,减少不必要的内存开销,只需要访问极少数量的磁盘。</p>

<p class="maodian"></p><h2>
        附录(SQL知识大图)</h2>
<p>
        <img title="面试 | 面向行的数据库VS面向列的数据库" alt="面试 | 面向行的数据库VS面向列的数据库" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/de453aa2c39176412bac8fdff1fda987.jpg" width="auto"></p>
<p>
        原文链接:</p>
頁: [1]
查看完整版本: 面试 | 面向行的数据库VS面向列的数据库