SSD 将聚簇索引和非聚簇索引之间的性能差距缩小了多少?
By how much do SSDs narrow the performance gap between clustered and non clustered indices?
大多数 SQL 关系数据库在 table 中支持聚簇索引的概念。聚簇索引通常作为 B 树实现,表示给定 table 中的实际记录,按 disk/storage 上的索引物理排序。这种特殊的聚簇索引的一个优点是,在遍历B树搜索一条记录或一组记录后,可以立即在叶节点处找到实际数据。
这与 非 聚集索引形成对比。非聚集索引存在于聚集索引之外,也使用一个或多个列对基础数据进行排序。但是,叶节点可能没有查询所需的所有列的数据。在这种情况下,数据库必须对原始数据进行磁盘搜索以获取此信息。
在我在 Stack Overflow 和其他地方看到的大多数数据库资源中,这种额外的磁盘查找被视为严重的性能损失。我的问题是,假设所有数据库文件都存储在固态驱动器 (SSD) 上,此分析将如何改变?
从Wikipedia page for SSDs开始,SSD的随机存取时间小于0.1毫秒,而机械硬盘的随机存取时间通常要慢10-100倍。
SSD 是否缩小了聚集索引和非聚集索引之间的差距,从而使前者对整体性能变得不那么重要?
只是提出建议(为了简单的评论而广泛)
考虑到一切都取决于键在非聚集索引和相应节点中的分布,(这完全是因果关系,只能用平均数来评估)仍然是任何访问都受益于SSD磁盘的性能。在这种情况下,介词的增加不是线性的,但仍然很大。因此,平均而言,它不应该是 1 到 100 的一个因数,恰恰是与分布随机性相关的问题,而是针对每一种表现出来的情况。访问速度快 100 倍.. 在这种情况下,因果关系越多,效率就越高.. 这种情况发生了。
然而,有一个基本事实......磁盘上的每个操作都更加有效,因此通常非聚集索引的行为在最佳上下文中变得明确。
考虑到这一点,应该从根本上缩小差距,这要归功于整个文件系统存在的环境,它是数据库的基础;从访问组成它的逻辑文件到实际保存数据的物理扇区
首先,额外的磁盘寻道并不是真正的"killer"。在微秒和毫秒都很重要的高事务环境中,这可能是一个大问题。但是,对于更长的 运行 查询,它几乎没有什么区别。
如果数据库智能地执行 "look ahead" 磁盘查找,则尤其如此。数据库通常 不会 等待数据,因为另一个线程正在预测需要哪些页面并努力将这些页面恢复。这通常只需按顺序扫描 "next" 页即可完成。
SSD 将加速几乎所有操作。他们确实改变了优化参数。特别是,我认为它们在吞吐量方面相对较快(尽管我没有特别跟上这项技术)。他们的最大胜利在于延迟——从发出磁盘块请求到检索到它的时间。
根据我的经验(几年前的经验),对于大多数操作,使用 SSD 的性能与内存数据库相当。
这是否会使集群索引冗余是另一回事。使用它们的一个关键地方是当您想要将相关的少量行(比如 "undeleted")与大量行分开时。通过将它们放在相同的数据页中,聚簇索引减少了读取的总行数——它不仅使读取速度更快。
首先,聚簇索引不保证行在物理上按索引顺序存储。例如,InnoDB 可以以非顺序方式存储聚簇索引。也就是说,包含 table 的连续行的两个数据库页面可能在物理上彼此靠近存储,或者在 table 空间中以任意顺序存储。聚集索引的 B 树数据结构具有指向叶页的指针,但它们不必以任何顺序存储。
SSD 有助于加快基于 IO 的操作,尤其是涉及磁盘查找的操作。它比旋转的磁盘快得多。但是 RAM 仍然比最好的 SSD 快几个数量级。
- 磁盘寻道:3,000,000ns
- SSD 随机读取:16,000ns
- 主内存参考:100ns
RAM 仍然远远胜过持久存储。如果您的数据集(或至少数据集的活动子集)适合 RAM,则您无需担心磁盘存储和 SSD 存储之间的差异。
回复您的评论:
聚簇索引很有帮助,因为当主键查找搜索 B 树并找到叶节点时,就在该行的所有其他字段与该主键值关联。
与 MyISAM 比较,其中主键索引与 table 的行分开。查询搜索主键索引的 B 树,并在叶节点处找到指向数据文件中存储相应行的位置的指针。所以它必须对数据文件进行第二次搜索。
这并不一定意味着InnoDB中的聚簇索引是连续存储的。它可能需要跳过一点才能读取 table 空间的所有页面。这就是将 RAM 中的页面放在缓冲池中如此有用的原因。
大多数 SQL 关系数据库在 table 中支持聚簇索引的概念。聚簇索引通常作为 B 树实现,表示给定 table 中的实际记录,按 disk/storage 上的索引物理排序。这种特殊的聚簇索引的一个优点是,在遍历B树搜索一条记录或一组记录后,可以立即在叶节点处找到实际数据。
这与 非 聚集索引形成对比。非聚集索引存在于聚集索引之外,也使用一个或多个列对基础数据进行排序。但是,叶节点可能没有查询所需的所有列的数据。在这种情况下,数据库必须对原始数据进行磁盘搜索以获取此信息。
在我在 Stack Overflow 和其他地方看到的大多数数据库资源中,这种额外的磁盘查找被视为严重的性能损失。我的问题是,假设所有数据库文件都存储在固态驱动器 (SSD) 上,此分析将如何改变?
从Wikipedia page for SSDs开始,SSD的随机存取时间小于0.1毫秒,而机械硬盘的随机存取时间通常要慢10-100倍。
SSD 是否缩小了聚集索引和非聚集索引之间的差距,从而使前者对整体性能变得不那么重要?
只是提出建议(为了简单的评论而广泛)
考虑到一切都取决于键在非聚集索引和相应节点中的分布,(这完全是因果关系,只能用平均数来评估)仍然是任何访问都受益于SSD磁盘的性能。在这种情况下,介词的增加不是线性的,但仍然很大。因此,平均而言,它不应该是 1 到 100 的一个因数,恰恰是与分布随机性相关的问题,而是针对每一种表现出来的情况。访问速度快 100 倍.. 在这种情况下,因果关系越多,效率就越高.. 这种情况发生了。 然而,有一个基本事实......磁盘上的每个操作都更加有效,因此通常非聚集索引的行为在最佳上下文中变得明确。
考虑到这一点,应该从根本上缩小差距,这要归功于整个文件系统存在的环境,它是数据库的基础;从访问组成它的逻辑文件到实际保存数据的物理扇区
首先,额外的磁盘寻道并不是真正的"killer"。在微秒和毫秒都很重要的高事务环境中,这可能是一个大问题。但是,对于更长的 运行 查询,它几乎没有什么区别。
如果数据库智能地执行 "look ahead" 磁盘查找,则尤其如此。数据库通常 不会 等待数据,因为另一个线程正在预测需要哪些页面并努力将这些页面恢复。这通常只需按顺序扫描 "next" 页即可完成。
SSD 将加速几乎所有操作。他们确实改变了优化参数。特别是,我认为它们在吞吐量方面相对较快(尽管我没有特别跟上这项技术)。他们的最大胜利在于延迟——从发出磁盘块请求到检索到它的时间。
根据我的经验(几年前的经验),对于大多数操作,使用 SSD 的性能与内存数据库相当。
这是否会使集群索引冗余是另一回事。使用它们的一个关键地方是当您想要将相关的少量行(比如 "undeleted")与大量行分开时。通过将它们放在相同的数据页中,聚簇索引减少了读取的总行数——它不仅使读取速度更快。
首先,聚簇索引不保证行在物理上按索引顺序存储。例如,InnoDB 可以以非顺序方式存储聚簇索引。也就是说,包含 table 的连续行的两个数据库页面可能在物理上彼此靠近存储,或者在 table 空间中以任意顺序存储。聚集索引的 B 树数据结构具有指向叶页的指针,但它们不必以任何顺序存储。
SSD 有助于加快基于 IO 的操作,尤其是涉及磁盘查找的操作。它比旋转的磁盘快得多。但是 RAM 仍然比最好的 SSD 快几个数量级。
- 磁盘寻道:3,000,000ns
- SSD 随机读取:16,000ns
- 主内存参考:100ns
RAM 仍然远远胜过持久存储。如果您的数据集(或至少数据集的活动子集)适合 RAM,则您无需担心磁盘存储和 SSD 存储之间的差异。
回复您的评论:
聚簇索引很有帮助,因为当主键查找搜索 B 树并找到叶节点时,就在该行的所有其他字段与该主键值关联。
与 MyISAM 比较,其中主键索引与 table 的行分开。查询搜索主键索引的 B 树,并在叶节点处找到指向数据文件中存储相应行的位置的指针。所以它必须对数据文件进行第二次搜索。
这并不一定意味着InnoDB中的聚簇索引是连续存储的。它可能需要跳过一点才能读取 table 空间的所有页面。这就是将 RAM 中的页面放在缓冲池中如此有用的原因。