<div class="paragraphs-wrap">html
<div class="ui internally grid translate-paragraph" data-paragraph-id="64659" data-translated-paragraph-id="64674"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <p> 既然 <a href="https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/" target="_blank" rel="nofollow">MySQL 8</a> 和 <a href="https://www.postgresql.org/about/news/1786/" target="_blank" rel="nofollow">PostgreSQL 10</a> 已经发布了,如今是时候回顾一下这两大开源关系型数据库是如何彼此竞争的。
</p> <p> 在这些版本以前,人们广泛认为,Postgres 在功能集表现更出色,也因其“学院派”风格而备受称赞,MySQL 则更善长大规模并发读/写。 </p> <p> 可是随着它们最新版本的发布,二者之间的差距明显变小了。 </p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/u/1391023" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="LinuxTech" data-user-id="1391023"> <span class="text-portrait" style="background: #e74c3c">L</span> </div> </a> <div class="content"> <a href="https://my.oschina.net/u/1391023" target="_blank" class="ui small header user __user">LinuxTech</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/28 21:26</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64674"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">1</span> </div> <div class="ui small horizontal list actions">mysql
</div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64660" data-translated-paragraph-id="64675"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <h2> 特性比较<br></h2><p><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">让咱们来看看咱们都喜欢谈论的“时髦”功能。</span></p><p></p><table><tbody><tr><th> 特性 </th><th> MySQL 8 </th><th> PostgreSQL 10 </th></tr></tbody><tbody><tr><th> 查询 & 分析 </th><th><br></th><th><br></th></tr><tr><td style="word-break: break-all;">公用表表达式 (CTEs) </td><td> ✔ New </td><td> ✔ </td></tr><tr><td style="word-break: break-all;"> 窗口函数</td><td> ✔ New </td><td> ✔ </td></tr><tr><th> 数据类型 </th><th><br></th><th><br></th></tr><tr><td style="word-break: break-all;"> JSON 支持 </td><td> ✔ Improved </td><td> ✔ </td></tr><tr><td> GIS / SRS </td><td> ✔ Improved </td><td> ✔ </td></tr><tr><td> 全文检索 </td><td> ✔ </td><td> ✔ </td></tr><tr><th> 可扩展性 </th><th><br></th><th><br></th></tr><tr><td> 逻辑复制 </td><td> ✔ </td><td> ✔ New </td></tr><tr><td> 半同步复制 </td><td> ✔ </td><td> ✔ New </td></tr><tr><td style="word-break: break-all;">声明式分区 </td><td> ✔ </td><td style="word-break: break-all;"> ✔ New</td></tr></tbody></table><p></p><p>过去常常会说 MySQL 最适合在线事务,PostgreSQL 最适合分析流程。但如今不是了。</p><p>公共表表达式(CTEs) 和窗口函数是选择 PostgreSQL 的主要缘由。可是如今,经过引用同一个表中的 boss_id 来递归地遍历一张雇员表,或者在一个排序的结果中找到一个中值(或 50%),这在 MySQL 上再也不是问题。</p><p>在 PostgreSQL 中进行复制缺少配置灵活性,这就是 <a href="https://eng.uber.com/mysql-migration/" target="_blank" rel="nofollow">Uber 转向 MySQL</a> 的缘由。可是如今,有了逻辑复制特性,就能够经过建立一个新版本的 Postgres 并切换到它来实现零停机升级。在一个巨大的时间序列事件表中截断一个陈旧的分区也要容易得多。</p><p>就特性而言,这两个数据库如今都是一致的。</p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/u/2560193" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="雪落无痕xdj" data-user-id="2560193"> <span class="text-portrait" style="background: #f1c40f">雪</span> </div> </a> <div class="content"> <a href="https://my.oschina.net/u/2560193" target="_blank" class="ui small header user __user">雪落无痕xdj</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/28 22:13</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64675"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">1</span> </div> <div class="ui small horizontal list actions"> </div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64661" data-translated-paragraph-id="64676"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <h2> 有哪些不一样之处呢?<br>
</h2> <p> <span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">如今,咱们只剩下一个问题 —— 那么,选择一个而不选另外一个的缘由是什么呢?</span> </p> <p> <span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;"><strong>生态系统</strong>是其中一个因素。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">MySQL 有一个充满活力的生态系统,包括 MariaDB、Percona、Galera 等等,以及除 InnoDB 之外的存储引擎,但这也多是和使人困惑的。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">Postgres 的高端选择有限,但随着最新版本引入的新功能,这会有所改变。</span> </p> <p> <span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;"><strong>治理</strong>是另外一个因素。当 Oracle(或最初的 SUN)收购 MySQL时,每一个人都担忧他们会毁掉这个产品,但在过去的十年里,这并非事实。事实上,在收购以后,发展反倒加速了。而 Postgres 在工做管理和协做社区方面有着丰富的经验。</span> </p> <p> <span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;"><strong>基础架构</strong>不会常常改变,<span style="color:#333333;font-family:Arial, "font-size:13.3333px;line-height:26px;background-color:#FFFFFF;">虽然近来没有对这方面的详细讨论,</span>这也是值得再次考虑的。</span> </p> <p> <span style="font-size:10pt;">来复习下:</span> </p> <table> <tbody> <tr> <th> 特性 </th> <th> MySQL 8 </th> <th> PostgreSQL 10 </th> </tr> </tbody> <tbody> <tr> <td> 架构 </td> <td> 单进程 </td> <td> 多进程 </td> </tr> <tr> <td> 并发 </td> <td> 多线程 </td> <td> fork(2) </td> </tr> <tr> <td> 表结构 </td> <td> 聚簇索引 </td> <td> 堆 </td> </tr> <tr> <td> 页压缩 </td> <td> Transparent </td> <td> TOAST </td> </tr> <tr> <td> 更新 </td> <td> In-Place / Rollback Segments </td> <td> Append Only / <a href="http://www.interdb.jp/pg/pgsql07.html" rel="nofollow">HOT</a> </td> </tr> <tr> <td> 垃圾回收 </td> <td> 清除线程 </td> <td> 自动清空进程 </td> </tr> <tr> <td> 事务日志 </td> <td> REDO Log (WAL) </td> <td> WAL </td> </tr> <tr> <td> 复制日志 </td> <td> Separate (Binlog) </td> <td> WAL </td> </tr> </tbody> </table> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/u/2560193" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="雪落无痕xdj" data-user-id="2560193"> <span class="text-portrait" style="background: #f1c40f">雪</span> </div> </a> <div class="content"> <a href="https://my.oschina.net/u/2560193" target="_blank" class="ui small header user __user">雪落无痕xdj</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/28 22:28</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64676"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">2</span> </div> <div class="ui small horizontal list actions">sql
</div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64662" data-translated-paragraph-id="64677"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <h3>进程vs线程</h3><p>当 <a href="https://www.postgresql.org/docs/10/static/tutorial-arch.html" target="_blank" rel="nofollow">Postgres 派生出一个子进程</a>来创建链接时,<a href="https://www.citusdata.com/blog/2017/05/10/scaling-connections-in-postgres/" target="_blank" rel="nofollow">每一个链接最多能够占用 10MB</a>。与 MySQL 的线程链接模型相比,它的内存压力更大,在 64 位平台上,线程的默认堆栈大小为 256KB。(固然,线程本地排序缓冲区等使这种开销变得不那么重要,即便在不能够忽略的状况下,仍然如此。)</p><p>尽管“<a href="https://en.wikipedia.org/wiki/Copy-on-write" target="_blank" rel="nofollow">写时复制</a>”保存了一些与父进程共享的、不可变的内存状态,可是当您有 1000 多个并发链接时,基于流程的架构的基本开销是很繁重的,并且它多是容量规划的最重要的因素之一。</p><p>也就是说,若是你在 30 台服务器上运行一个 Rails 应用,每一个服务器都有 16 个 CPU 核心 32 线程,那么你有 960 个链接。可能只有不到 0.1% 的应用会超出这个范围,但这是须要记住的。</p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/u/2560193" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="雪落无痕xdj" data-user-id="2560193"> <span class="text-portrait" style="background: #f1c40f">雪</span> </div> </a> <div class="content"> <a href="https://my.oschina.net/u/2560193" target="_blank" class="ui small header user __user">雪落无痕xdj</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/28 22:41</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64677"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">1</span> </div> <div class="ui small horizontal list actions"> </div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64663" data-translated-paragraph-id="64678"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <h3> 聚簇索引 vs 堆表<br>
</h3> <p> <a href="https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-2017" target="_blank" rel="nofollow"><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">聚簇索引</span></a><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">是一种表结构,其中的行直接嵌入其主键的 b 树结构中。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">一个(非汇集)堆是一个常规的表结构,它与索引分别填充数据行。</span> </p> <p> <span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">有了聚簇索引,当您经过主键查找记录时,单次 I/O 就能够检索到整行,而非集群则老是须要查找引用,至少须要两次 I/O。因为外键引用和 JOIN 将触发主键查找,因此影响可能很是大,这将致使大量查询。</span> </p> <p> <span style="color:#333333;"><span style="font-family:Arial, font-size:13.3333px;line-height:26px;background-color:#FFFFFF;">聚簇</span></span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">索引的一个理论上的缺点是,当您使用二级索引进行查询时,它须要遍历两倍的树节点,第一次扫描二级索引,而后遍历<span style="color:#333333;font-family:Arial, "font-size:13.3333px;line-height:26px;background-color:#FFFFFF;">汇集</span>索引,这也是一棵树。</span> </p> <p> <span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">可是,若是按照现代<a href="https://en.wikipedia.org/wiki/Convention_over_configuration" target="_blank" rel="nofollow">表设计的约定</a>,将一个自动增量整数做为主键<a href="https://blog.dumper.io/showdown-mysql-8-vs-postgresql-10/#fn1" target="_blank" rel="nofollow">[1]</a>——它被称为<a href="https://en.wikipedia.org/wiki/Surrogate_key" target="_blank" rel="nofollow">代理键</a>——那么拥有一个<a href="https://www.mssqltips.com/sqlservertutorial/3209/make-sure-all-tables-have-a-clustered-index-defined/" target="_blank" rel="nofollow">汇集索引几乎老是可取的</a>。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">更重要的是,若是您作了大量的<span style="color:#333333;font-family:Arial, "font-size:13.3333px;line-height:26px;background-color:#FFFFFF;"> ORDER BY id 来</span>检索最近的(或最老的)N 个记录的操做,我认为这是很适用的。</span> </p> <p> <span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">Postgres 不支持汇集索引,而 MySQL(InnoDB)不支持堆。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">但无论怎样,若是你有大量的内存,差异应该是很小的。</span> </p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/u/2560193" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="雪落无痕xdj" data-user-id="2560193"> <span class="text-portrait" style="background: #f1c40f">雪</span> </div> </a> <div class="content"> <a href="https://my.oschina.net/u/2560193" target="_blank" class="ui small header user __user">雪落无痕xdj</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/28 22:54</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64678"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">0</span> </div> <div class="ui small horizontal list actions">数据库
</div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64664" data-translated-paragraph-id="64679"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <h3>页结构和压缩</h3><p>Postgres 和 MySQL 都有基于页面的物理存储。(8KB vs 16KB)</p><p><img alt="" src="https://static.oschina.net/uploads/space/2018/0528/115001_ZvRa_2720166.png" class="zoom-in-cursor"><br><a href="http://rachbelaid.com/introduction-to-postgres-physical-storage/" rel="nofollow">PostgreSQL 物理存储的介绍</a></p><p>页结构看起来就像右边的图。它包含一些咱们不打算在这里讨论的条目,可是它们包含关于页的元数据。条目后面的项是一个数组标识符,由指向元组或数据行的(偏移、长度)对组成。在 Postgres 中,相同记录的多个版本能够以这种方式存储在同一页面中。</p><p><img alt="" src="https://static.oschina.net/uploads/space/2018/0528/115017_2Ujt_2720166.jpg" class="zoom-in-cursor"><br>MySQL 的表空间结构与 Oracle 类似,它有多个层次,包括层、区段、页面和行层。</p><p>此外,它还有一个用于撤销的单独段,称为“回滚段”。与 Postgres 不一样的是,MySQL 将在一个单独的区域中保存同一记录的多个版本。</p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/u/2560193" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="雪落无痕xdj" data-user-id="2560193"> <span class="text-portrait" style="background: #f1c40f">雪</span> </div> </a> <div class="content"> <a href="https://my.oschina.net/u/2560193" target="_blank" class="ui small header user __user">雪落无痕xdj</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/28 23:01</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64679"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">0</span> </div> <div class="ui small horizontal list actions"> </div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64665" data-translated-paragraph-id="64680"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <p>若是存在一行必须适合两个数据库的单个页面,,这意味着一行必须小于 8KB。(至少有 2 行必须适合 MySQL 的页面,恰巧是 16KB/2 = 8KB)</p><p><br></p><p><img alt="" src="https://static.oschina.net/uploads/space/2018/0528/115033_Akyb_2720166.png" class="zoom-in-cursor"><br>那么当你在一个列中有一个大型 JSON 对象时会发生什么呢?</p><p>Postgres 使用 <a href="https://wiki.postgresql.org/wiki/TOAST" target="_blank" rel="nofollow">TOAST</a>,这是一个专用的影子表(shadow table)存储。当行和列被选中时,大型对象就会被拉出。换句话说,大量的黑盒不会污染你宝贵的缓存。它还支持对 TOAST 对象的压缩。</p><p>MySQL 有一个更复杂的特性,叫作<a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-page-compression.html" target="_blank" rel="nofollow">透明页压缩</a>,这要归功于高端 SSD 存储供应商 <a href="https://en.wikipedia.org/wiki/Fusion-io" target="_blank" rel="nofollow">Fusio-io</a> 的贡献。它设计目的是为了更好地使用 SSD,在 SSD 中,写入量与设备的寿命直接相关。</p><p>对 MySQL 的压缩不只适用于页面外的大型对象,并且适用于全部页面。它经过在<a href="https://en.wikipedia.org/wiki/Sparse_file" target="_blank" rel="nofollow">稀疏文件</a>中使用打孔来实现这一点,这是被 <a href="https://en.wikipedia.org/wiki/Ext4" rel="nofollow">ext4</a> 或 <a href="https://en.wikipedia.org/wiki/Btrfs" rel="nofollow">btrfs</a> 等现代文件系统支持的。</p><p>有关更多细节,请参见:<a href="https://mariadb.org/significant-performance-boost-with-new-mariadb-page-compression-on-fusionio/" target="_blank" rel="nofollow">在 FusionIO 上使用新 MariaDB 页压缩得到显著的性能提高</a>。</p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/u/2560193" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="雪落无痕xdj" data-user-id="2560193"> <span class="text-portrait" style="background: #f1c40f">雪</span> </div> </a> <div class="content"> <a href="https://my.oschina.net/u/2560193" target="_blank" class="ui small header user __user">雪落无痕xdj</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/28 23:08</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64680"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">0</span> </div> <div class="ui small horizontal list actions"> </div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64666" data-translated-paragraph-id="64681"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <h3> 更新的开销<br></h3><p><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">另外一个常常被忽略的特性,可是对性能有很大的影响,而且多是最具争议的话题,是更新。</span></p><p><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">这也是Uber放弃Postgres的另外一个缘由,这激起了许多Postgres的支持者来反驳它。</span></p><ul><li><p><a href="https://dzone.com/articles/on-ubers-choice-of-databases" rel="nofollow">MySQL 对Uber</a><a href="https://dzone.com/articles/on-ubers-choice-of-databases" rel="nofollow">可能</a>是合适的, 可是未必对你合适 </p></li><li><p><a href="http://thebuild.com/presentations/uber-perconalive-2017.pdf" rel="nofollow">一篇PostgreSQL对Uber的回应 (PDF)</a></p></li></ul><p><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">二者都是MVCC数据库,它们能够隔离多个版本的数据。</span></p><p><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">为了作到这一点,Postgres将旧数据保存在堆中,直到被清空,而MySQL将旧数据移动到一个名为回滚段的单独区域。</span></p><p><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">在Postgres中,当您尝试更新时,整个行必须被复制,以及指向它的索引条目也被复制。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">这在必定程度上是由于Postgres不支持汇集索引,因此从索引中引用的一行的物理位置不是由逻辑键抽象出来的。</span></p><p><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">为了解决这个问题,Postgres使用了<a href="http://www.interdb.jp/pg/pgsql07.html" target="_blank" rel="nofollow">堆上元组</a>(HOT),在可能的状况下不更新索引。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">可是,若是更新足够频繁(或者若是一个元组比较大),元组的历史能够很容易地超过8 KB的页面大小,跨越多个页面并限制该特性的有效性。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">修剪和/或碎片整理的时间取决于启发式解决方案。</span><span style="color:#333333;font-family:Arial, "font-size:14px;line-height:26px;background-color:#FFFFFF;">另外,设置不超过100的<a href="https://www.postgresql.org/docs/10/static/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS" target="_blank" rel="nofollow">填充参数</a>会下降空间效率——这是一种很难在建立表时考虑的折衷方案。</span></p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/u/2560193" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="雪落无痕xdj" data-user-id="2560193"> <span class="text-portrait" style="background: #f1c40f">雪</span> </div> </a> <div class="content"> <a href="https://my.oschina.net/u/2560193" target="_blank" class="ui small header user __user">雪落无痕xdj</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/28 23:16</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64681"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">0</span> </div> <div class="ui small horizontal list actions"> </div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64667" data-translated-paragraph-id="64692"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <p> 这种限制更深刻; 由于索引元组没有关于事务的任何信息,因此直到9.2以前一直不能支持<a href="https://use-the-index-luke.com/sql/clustering/index-only-scan-covering-index" target="_blank" rel="nofollow">仅索引扫描</a>。 它是全部主要数据库(包括MySQL,Oracle,IBM DB2和Microsoft SQL Server)支持的最古老,最重要的优化方法之一。 但即便使用最新版本,当有许多UPDATE在<a href="http://www.interdb.jp/pg/pgsql06.html#_6.2." target="_blank" rel="nofollow">可见性映射</a>中设置脏位时,Postgres也不能彻底支持仅索引扫描,而且在咱们不须要时常常选择Seq扫描。</p><p> 在MySQL上,更新发生在原地,旧的行数据被封存在一个称为回滚段的独立区域中。 结果是你不须要VACUUM,而且提交很是快,而回滚相对较慢,这对于大多数用例来讲是一个可取的折衷。</p><p> 它也<a href="https://www.percona.com/blog/2011/01/12/innodb-undo-segment-siz-and-transaction-isolation/" target="_blank" rel="nofollow">足够聪明</a>,尽快清除历史。 若是事务的隔离级别设置为<strong>READ-COMMITTED</strong>或更低,则在语句完成时清除历史记录。</p><p> 事务记录的大小不会影响主页面。 碎片化是一个伪命题。 所以,在MySQL上能更好,更可预测总体性能。</p><p><br></p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/crooner" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="溪边九节" data-user-id="553781"> <img src="https://static.oschina.net/uploads/user/276/553781_50.jpeg?t=1514855267000" alt="溪边九节" title="溪边九节"> </div> </a> <div class="content"> <a href="https://my.oschina.net/crooner" target="_blank" class="ui small header user __user">溪边九节</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/30 09:34</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64692"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">0</span> </div> <div class="ui small horizontal list actions"> </div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui internally grid translate-paragraph" data-paragraph-id="64668" data-translated-paragraph-id="64682"> <div class="row"> <div class="twelve wide computer twelve wide tablet sixteen wide mobile column content translate-content"> <h3> Garbage Collection 垃圾回收<br></h3><p>在Postgres中VACUUM上开销很高,由于它在主要工做在堆区,形成了直接的资源竞争。它感受就像是编程语言中的垃圾回收 - 它会挡在路上,并随时让你停下来。<br><br>为具备数十亿记录的表配置<a href="https://www.citusdata.com/blog/2016/11/04/autovacuum-not-the-enemy/" rel="nofollow">autovacuum</a>仍然是一项挑战。<br><br>在MySQL上清除(Purge)也可能至关繁重,但因为它是在单独的回滚段中使用专用线程运行的,所以它不会以任何方式影响读取的并发性。即便使用<a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-improved-purge-scheduling.html" rel="nofollow">默认配置</a>,变膨胀的回滚段使你执行速度减慢的可能性也是很低的。<br><br>拥有数十亿记录的繁忙表不会致使MySQL上的历史数据膨胀,诸如存储上的文件大小和查询性能等事情上几乎是能够预测的而且很稳定。</p> </div> <div class="four wide computer tablet only column translate-user"> <div class="ui items"> <div class="item"> <a class="ui image" href="https://my.oschina.net/tocy" target="_blank"> <div class="osc-avatar small-portrait _35x35 avatar" title="Tocy" data-user-id="734219"> <img src="https://static.oschina.net/uploads/user/367/734219_50.jpeg?t=1488431231000" alt="Tocy" title="Tocy"> </div> </a> <div class="content"> <a href="https://my.oschina.net/tocy" target="_blank" class="ui small header user __user">Tocy</a> <div class="extra"> <div class="ui mini list"> <div class="item">翻译于 2018/05/29 09:13</div> </div> <div class="ui mini labeled button"> <div class="ui mini basic button vote-up-btn" data-translated-paragraph-id="64682"> <i class="thumbs up outline icon"></i> 顶 </div> <span class="ui active disabled basic label vote-count">0</span> </div> <div class="ui small horizontal list actions"> </div> </div> </div> </div> <div class="item footer-info"> </div> </div> </div> </div> </div> <div class="ui basic center aligned segment pagination-wrap"> <div class="ui pagination menu"> <a class="disabled item prev-item"><</a> <a href="?lang=chs&p=1" class="active item page-num-item">1</a> <a href="?lang=chs&p=2" class="item page-num-item">2</a> <a href="?lang=chs&p=2" class="item next-item">></a> </div> </div> </div>
原文地址:https://www.oschina.net/translate/showdown-mysql-8-vs-postgresql-10编程