matt Asked: 2015-10-17 02:29:55 +0800 CST2015-10-17 02:29:55 +0800 CST 2015-10-17 02:29:55 +0800 CST InnoDB 是否将行数存储在二级索引 B-Tree 非叶节点中? 772 InnoDB是否存储二级索引B-Tree非叶节点中子节点的行数? 如果是这样,MySQL 是否使用此信息来加速具有范围约束的 COUNT(*) 查询(假设存在适当的索引)。 mysql index 1 个回答 Voted Best Answer jkavalik 2015-10-17T03:30:41+08:002015-10-17T03:30:41+08:00 对于第一部分,我不是 100% 确定,但我会说不——如果确实如此,它必须在每次写入时一直将计数更新到 root,这意味着将更多页面写入磁盘并进行同步。当您添加/删除叶节点时,在好的情况下,您只需要将那一页写入磁盘,这样您就必须更新所有这些“父节点”——比如 2-5 页,具体取决于表中的行。 另一件事是 InnoDB 无论如何都不能在查询中使用该信息。当您运行 COUNT 时,您在某个事务中运行它,这通常意味着“可重复读取”模式(但类似的原因将适用于其他模式)。因此查询必须检查当前事务范围内每行/记录的可见性。而且您不能在 b 树中为每个活动事务单独计数。
对于第一部分,我不是 100% 确定,但我会说不——如果确实如此,它必须在每次写入时一直将计数更新到 root,这意味着将更多页面写入磁盘并进行同步。当您添加/删除叶节点时,在好的情况下,您只需要将那一页写入磁盘,这样您就必须更新所有这些“父节点”——比如 2-5 页,具体取决于表中的行。
另一件事是 InnoDB 无论如何都不能在查询中使用该信息。当您运行 COUNT 时,您在某个事务中运行它,这通常意味着“可重复读取”模式(但类似的原因将适用于其他模式)。因此查询必须检查当前事务范围内每行/记录的可见性。而且您不能在 b 树中为每个活动事务单独计数。