MySQL innodb b-tree 在后台重新平衡异步或如果需要重新平衡则在每次写入操作时完成
MySQL innodb b-tree rebalance async in background or finish on per write operation if rebalance is needed
我只是好奇什么时候mysql innodb在需要的时候执行rebalance操作
谢谢。
如果索引是 UNIQUE KEY 或 PRIMARY KEY,InnoDB 必须同步更新 B 树(在您 INSERT/UPDATE/DELETE 时)。
否则,对于非唯一索引,更改将写入 InnoDB change buffer。这些补充了索引的 B 树。
更改会在下次某人的查询读取这些索引条目时合并到 B 树中,否则它们最终会被 "merge thread." 合并 InnoDB 也有一个 "slow shutdown" 选项,它完全在您关闭 MySQL 服务器时合并所有挂起的更改缓冲区条目。
"Rebalancing"和"defragmenting"是密切相关的。对于这个答案,我将互换使用这些术语。
InnoDB 从不自动重新平衡 整个 BTree。
InnoDB,当存储一个'dirty'块时,可能将那个一个块与相邻块合并,从而做一个一点点重新平衡。其他线程的锁 可能 阻止与这些块混淆,从而推迟操作。
InnoDB "never" 需要完全重新平衡;对于大多数用法,它的 BTree 是 "balanced enough"。此外,与成本相比,完全重新分段的好处微不足道。以前是数据BTreeand/or索引BTree的全量拷贝。较新的 ALTER
"algorithms" 可以做到 INPLACE
(或其他)。如果您坚持要重新平衡,请提供之前和之后的统计数据以证明您获得了多少收益。
删除 table 的大部分内容很慢并且会使 table 相当零散。通常最好将行复制到 keep。这具有碎片整理"for free"的效果。而且它运行得更快。更多关于 'big' 删除:http://mysql.rjweb.org/doc.php/deletebig
可以说,InnoDB 的 BTree 从来都不是 "unbalanced",因为树的深度 [我认为] 是恒定的。然而,任何块都可能变得不够满。当非叶节点变得不够满时,即 'tilts' BTree。因此,您可以争辩说 "fragmentation" 会导致 "unbalance"?
"change buffer" 将非 UNIQUE
索引更新排队等待 'delayed' 写入。这允许更有效地完成索引更新,从而在某种程度上有利于 BTree 的任何本地化清理。
我只是好奇什么时候mysql innodb在需要的时候执行rebalance操作
谢谢。
如果索引是 UNIQUE KEY 或 PRIMARY KEY,InnoDB 必须同步更新 B 树(在您 INSERT/UPDATE/DELETE 时)。
否则,对于非唯一索引,更改将写入 InnoDB change buffer。这些补充了索引的 B 树。
更改会在下次某人的查询读取这些索引条目时合并到 B 树中,否则它们最终会被 "merge thread." 合并 InnoDB 也有一个 "slow shutdown" 选项,它完全在您关闭 MySQL 服务器时合并所有挂起的更改缓冲区条目。
"Rebalancing"和"defragmenting"是密切相关的。对于这个答案,我将互换使用这些术语。
InnoDB 从不自动重新平衡 整个 BTree。
InnoDB,当存储一个'dirty'块时,可能将那个一个块与相邻块合并,从而做一个一点点重新平衡。其他线程的锁 可能 阻止与这些块混淆,从而推迟操作。
InnoDB "never" 需要完全重新平衡;对于大多数用法,它的 BTree 是 "balanced enough"。此外,与成本相比,完全重新分段的好处微不足道。以前是数据BTreeand/or索引BTree的全量拷贝。较新的 ALTER
"algorithms" 可以做到 INPLACE
(或其他)。如果您坚持要重新平衡,请提供之前和之后的统计数据以证明您获得了多少收益。
删除 table 的大部分内容很慢并且会使 table 相当零散。通常最好将行复制到 keep。这具有碎片整理"for free"的效果。而且它运行得更快。更多关于 'big' 删除:http://mysql.rjweb.org/doc.php/deletebig
可以说,InnoDB 的 BTree 从来都不是 "unbalanced",因为树的深度 [我认为] 是恒定的。然而,任何块都可能变得不够满。当非叶节点变得不够满时,即 'tilts' BTree。因此,您可以争辩说 "fragmentation" 会导致 "unbalance"?
"change buffer" 将非 UNIQUE
索引更新排队等待 'delayed' 写入。这允许更有效地完成索引更新,从而在某种程度上有利于 BTree 的任何本地化清理。