InfoQ Uber为什么放弃Postgres选择迁移到MySQL?( 五 )
文章图片
要基于(first,last)索引执行查询 , 需要进行两次查找 。 第一次先搜索表 , 找到记录的主键 。 在找到主键之后 , 搜索主键索引 , 找到数据行对应的磁盘位置 。
所以 , 在执行二级查找时 , InnoDB相比Postgres略有不利 , 因为InnoDB必须搜索两个索引 , 而Postgres只需要搜索一个 。 但是 , 由于数据已经规范化 , 在更新行数据时只需要更新实际发生变化的索引记录 。 此外 , InnoDB通常会在原地进行行数据更新 。 为了支持MVCC , 如果旧事务需要引用一行数据 , MySQL会将旧行复制到一个叫作回滚段的特殊区域中 。
我们来看看更新al-Khwārizmī的出生年份会发生什么 。 如果空间足够 , id为4的那一行数据中的出生年份字段会进行原地更新(实际上 , 这个更新总是发生在原地 , 因为出生年份是一个占用固定空间量的整数) 。 出生年份索引也进行原地更新 。 旧数据行将被复制到回滚段 。 主键索引不需要更新 , (first,last)索引也不需要更新 。 即使这张表有大量索引 , 也只需要更新包含birth_year字段的索引 。 假设我们基于signup_date、last_login_time等字段建立了索引 , 我们不需要更新这些索引 , 但在Postgres中需要更新 。
这种设计还让数据清理和压缩变得更加高效 。 回滚段中的数据可以直接清除 , 相比之下 , Postgres的autovacuum进程必须进行全表扫描来识别哪些行可以清除 。
文章图片
MySQL使用了额外的中间层:二级索引记录指向主索引记录 , 主索引保存了数据行在磁盘上的位置 。 如果数据行偏移量发生变化 , 只需要更新主索引 。
复制
MySQL支持多种不同的复制模式:
基于语句的复制将会复制逻辑SQL语句(它将按字面意义复制SQL语句 , 例如:UPDATEusersSETbirth_year=770WHEREid=4)
基于行的复制将会复制发生变化的行记录
混合复制将这两种模式混合在一起
这几种模式各有优缺点 。 基于语句的复制通常是最紧凑的 , 但可能需要副本应用大量语句来更新少量数据 。 另一方面 , 基于行的复制(与PostgresWAL复制类似)虽然更为冗繁 , 但更具可预测性和在副本上的更新效率 。
在MySQL中 , 只有主索引有指向行的磁盘偏移量的指针 。 在进行复制时 , 这具有重要的意义 。 MySQL复制流只需要包含有关行的逻辑更新信息 。 对于类似“将行X的时间戳从T_1更改为T_2”这样的更新 , 副本会自动推断需要修改哪些索引 。
相比之下 , Postgres复制流包含了物理变更 , 例如“在磁盘偏移量8,382,491处写入字节XYZ” 。 在使用Postgres时 , 对磁盘进行的每一个物理变更都需要包含在WAL流中 。 较小的逻辑修改(例如更新时间戳)也需要执行很多磁盘变更:Postgres必须插入新的元组 , 并更新所有索引 , 让它们指向这个元组 , 所以会有很多变更被放入WAL流中 。 这种设计差异意味着MySQL复制二进制日志比PostgreSQLWAL流更紧凑 。
复制方式也对副本的MVCC产生重要影响 。 由于MySQL复制流具有逻辑更新 , 副本可以具有真正的MVCC语义 , 所以对副本的读取查询不会阻塞复制流 。 相比之下 , PostgresWAL流包含了磁盘上的物理更改 , Postgres副本无法应用与读取查询相冲突的复制更新 , 因此无法实现MVCC 。
MySQL的复制架构意味着即使有bug导致表损坏 , 也不太可能会发生灾难性故障 。 因为复制发生在逻辑层 , 所以像重新平衡B树之类的操作永远不会导致索引损坏 。 一个典型的MySQL复制问题是语句被跳过(或者被应用两次) , 这可能导致数据丢失或无效 , 但不会导致数据库中断 。
最后 , MySQL的复制架构可以很容易在不同的MySQL版本之间进行复制 。 MySQL的逻辑复制格式还意味着存储引擎层中的磁盘变更不会影响复制格式 。 在进行MySQL升级时 , 典型的做法是一次将更新应用于一个副本 , 在更新完所有副本后 , 将其中一个提升为新的主副本 。 这几乎可以实现零停机升级 , 很容易就可以让MySQL保持最新状态 。
推荐阅读
- 前有iPhone 12,后有Mate 40,为什么我却攥着中兴天机Axon 20 5G不放
- 机核网|为什么我觉得《刺客信条》越来越差了:游戏性篇
- 捷途|买新车时,为什么4S店都要送贴膜?原来里面这么多猫腻,太坑了
- 做你一辈子的蜡笔|西方为什么不假思索的污蔑中国?因为我们的这个错误!
- 暖日科技盈如|这到底是为什么?,俄罗斯华人给出劝告:最好别跟俄罗斯女孩结婚
- 什么值得买|为什么要精养信用卡?因为信用卡背后有你想象不到的财富!
- 汽车之家|我想说因为了解因此喜欢,别人总问我为什么喜欢风光ix5
- 电动大咖|3的为什么是宏光MINI EV,打败特斯拉Model
- 给你说个车|都不会考虑四驱,这是为什么呢?,多数人在买SUV时
- |为什么每一年的高考试卷,要安排在监狱里面印刷?原因你可能不信