在快速变化的列上建立索引
Index on a rapidly changing column
MySQL 架构设计。
- 在像“lastUpdatedOn”这样快速变化的列上添加索引值得吗?
- 如何计算权衡?
由于列将快速变化,即在每次保存调用时,数据库必须重新索引,即更改 b-tree 作为每次保存调用的额外成本。通过计算权衡,我想知道(如果可能的话)reads/writes.
的成本
例如,成本 b-tree 更改可能相当于 1 次写入操作,在这种情况下,给定列上的索引仅在相关应用程序中 read:write 比率 > 2:1 时才有利可图。
我理解成本可能无法像示例中的写入那样表达,但就 DS 而言,两者都显示为 O(lgn) + 一些 IO,因此类比。
是否有一个包含“快速变化的列”的索引是一个权衡。
UPDATE
需要删除索引中的一个条目并在索引的其他位置添加一个新条目。
另一方面,索引可能由于索引而大大加快。
请提供具体示例,以便我们进一步讨论权衡。
常规非UNIQUE
索引(与FULLTEXT
和SPATIAL
相对)是这样维护的:
buffer_pool 中有一个“更改缓冲区”(qv),用于维护尚未写入磁盘的索引更新。
当 DELETE
发生时,将一个条目添加到更改缓冲区,表示需要删除索引条目。
对于UPDATE
,两个条目可能需要放入CB。
当 SELECT
使用这样的索引时,它会同时检查 CB 和实际的磁盘 BTree 以查找索引。 BTree 在 buffer_pool 中缓存(逐块)。 (一个块是 16KB,可以容纳数百个条目。)
CB 会“在后台”或“根据需要”刷新到磁盘。这涉及获取索引块(除非已经缓存),更新一些条目(删除,and/or 添加),然后写回磁盘。读取和写入都缓存在 buffer_pool 中,因此其中一个或都不是物理 I/O.
MySQL 不会“重建”常规索引(“重新索引”),除非通过某些 ALTERs
或 OPTIMIZE
。也就是说,所有更改都是即时进行的。 CB的动作对用户是透明的。
MySQL 架构设计。
- 在像“lastUpdatedOn”这样快速变化的列上添加索引值得吗?
- 如何计算权衡?
由于列将快速变化,即在每次保存调用时,数据库必须重新索引,即更改 b-tree 作为每次保存调用的额外成本。通过计算权衡,我想知道(如果可能的话)reads/writes.
的成本例如,成本 b-tree 更改可能相当于 1 次写入操作,在这种情况下,给定列上的索引仅在相关应用程序中 read:write 比率 > 2:1 时才有利可图。
我理解成本可能无法像示例中的写入那样表达,但就 DS 而言,两者都显示为 O(lgn) + 一些 IO,因此类比。
是否有一个包含“快速变化的列”的索引是一个权衡。
UPDATE
需要删除索引中的一个条目并在索引的其他位置添加一个新条目。
另一方面,索引可能由于索引而大大加快。
请提供具体示例,以便我们进一步讨论权衡。
常规非UNIQUE
索引(与FULLTEXT
和SPATIAL
相对)是这样维护的:
buffer_pool 中有一个“更改缓冲区”(qv),用于维护尚未写入磁盘的索引更新。
当 DELETE
发生时,将一个条目添加到更改缓冲区,表示需要删除索引条目。
对于UPDATE
,两个条目可能需要放入CB。
当 SELECT
使用这样的索引时,它会同时检查 CB 和实际的磁盘 BTree 以查找索引。 BTree 在 buffer_pool 中缓存(逐块)。 (一个块是 16KB,可以容纳数百个条目。)
CB 会“在后台”或“根据需要”刷新到磁盘。这涉及获取索引块(除非已经缓存),更新一些条目(删除,and/or 添加),然后写回磁盘。读取和写入都缓存在 buffer_pool 中,因此其中一个或都不是物理 I/O.
MySQL 不会“重建”常规索引(“重新索引”),除非通过某些 ALTERs
或 OPTIMIZE
。也就是说,所有更改都是即时进行的。 CB的动作对用户是透明的。