在快速变化的列上建立索引

Index on a rapidly changing column

MySQL 架构设计。

  1. 在像“lastUpdatedOn”这样快速变化的列上添加索引值得吗?
  2. 如何计算权衡?

由于列将快速变化,即在每次保存调用时,数据库必须重新索引,即更改 b-tree 作为每次保存调用的额外成本。通过计算权衡,我想知道(如果可能的话)reads/writes.

的成本

例如,成本 b-tree 更改可能相当于 1 次写入操作,在这种情况下,给定列上的索引仅在相关应用程序中 read:write 比率 > 2:1 时才有利可图。

我理解成本可能无法像示例中的写入那样表达,但就 DS 而言,两者都显示为 O(lgn) + 一些 IO,因此类比。

是否有一个包含“快速变化的列”的索引一个权衡。

UPDATE 需要删除索引中的一个条目并在索引的其他位置添加一个新条目。

另一方面,索引可能由于索引而大大加快。

请提供具体示例,以便我们进一步讨论权衡。

常规非UNIQUE索引(与FULLTEXTSPATIAL相对)是这样维护的:

buffer_pool 中有一个“更改缓冲区”(qv),用于维护尚未写入磁盘的索引更新。

DELETE 发生时,将一个条目添加到更改缓冲区,表示需要删除索引条目。

对于UPDATE,两个条目可能需要放入CB。

SELECT 使用这样的索引时,它会同时检查 CB 和实际的磁盘 BTree 以查找索引。 BTree 在 buffer_pool 中缓存(逐块)。 (一个块是 16KB,可以容纳数百个条目。)

CB 会“在后台”或“根据需要”刷新到磁盘。这涉及获取索引块(除非已经缓存),更新一些条目(删除,and/or 添加),然后写回磁盘。读取和写入都缓存在 buffer_pool 中,因此其中一个或都不是物理 I/O.

MySQL 不会“重建”常规索引(“重新索引”),除非通过某些 ALTERsOPTIMIZE。也就是说,所有更改都是即时进行的。 CB的动作对用户是透明的。