非顺序(例如,UUID/GUID)数据如何降低索引性能?

How does non-sequential (eg, UUID/GUID) data degrade index performance?

我读过几篇关于在 MySQL 中使用 UUID 作为主键的性能的在线文章 - 一个共同的主题,无论是赞成还是反对,都认为非-顺序数据会损害索引性能。

https://blog.codinghorror.com/primary-keys-ids-versus-guids/

The generated GUIDs should be partially sequential for best performance

https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/

Create function to rearrange UUID fields and use it (after showing how rearranging UUID can drastically improve performance)

但是,我根本无法理解非顺序数据如何影响 B-TREES、HASHES、CLUSTERED 索引等索引

您可以将 my UUID blog 添加到您的列表中。 (它同样适用于 MySQL。)

请注意,直到索引(无论是聚簇,还是 BTree、哈希或其他索引)太大而无法缓存在 RAM 中时,才会出现性能问题。那时,您获取(或尝试插入)的 "next" UUID 不太可能在 RAM 中,因此需要 I/O,这会影响性能。

相比之下,插入以日期时间为键的行,并且按时间顺序这样做,主要是插入到 BTree 的同一个块中。这意味着 "next" 行 不太可能 需要 I/O.

I/O 是影响性能的最大因素。

我的博客指出了如何将 Type 1 uuid 转换为类似于时间戳的东西,从而实现 "locality of reference" 从而减少 I/O ,因此速度更快。 MySQL 8.0 具有与我的存储函数功能相同的内置函数。仍然,您需要 Type 1 需要调用函数,以减少 I/O.