27. 基于索引的聚类¶
数据库只能以从磁盘获取数据的速度来检索信息。小型数据库将完全浮动到 RAM 缓存中,并摆脱物理磁盘限制,但对于大型数据库,访问物理磁盘将是磁盘访问速度的限制因素。
数据是机会性地写入磁盘的,因此数据在磁盘上的存储顺序与应用程序访问或组织数据的方式之间不一定存在任何关联。
加快数据访问速度的一种方法是确保可能在同一结果集中一起检索的记录位于硬盘盘片上的类似物理位置。这称为“聚类”。
要使用的正确聚类方案可能很棘手,但有一个通用的规则适用:索引为数据定义了一种自然的排序方案,该方案类似于用于检索数据的访问模式。
因此,在某些情况下,以与索引相同的顺序对磁盘上的数据进行排序可以提供速度优势。
27.1. 基于 R 树的聚类¶
空间数据往往在空间相关的窗口中被访问:想想 Web 或桌面应用程序中的地图窗口。窗口中的所有数据都具有相似的地理位置值(否则它就不会在窗口中!)。
因此,基于空间索引的聚类对于将通过空间查询访问的空间数据很有意义:相似的事物往往具有相似的地理位置。
让我们根据其空间索引对 nyc_census_blocks
进行聚类
-- Cluster the blocks based on their spatial index
CLUSTER nyc_census_blocks USING nyc_census_blocks_geom_idx;
该命令根据空间索引 nyc_census_blocks_geom_gist
定义的顺序重新写入 nyc_census_blocks
。你能感觉到速度差异吗?也许没有,因为原始数据可能已经具有一些预先存在的空间排序(这在 GIS 数据集中并不罕见)。
27.2. 磁盘与内存/SSD¶
大多数现代数据库使用 SSD 存储,与旧的旋转磁介质相比,SSD 在随机访问方面快得多。此外,大多数现代数据库运行在足够小的数据之上,这些数据可以放入数据库服务器的 RAM 中,并最终作为操作系统“虚拟文件系统”将其缓存。
集群仍然有必要吗?
令人惊讶的是,是的。将空间上“彼此靠近”的记录保存在内存中“彼此靠近”,会增加相关记录一起向上移动服务器“内存缓存层次结构”的可能性,从而使内存访问更快。
系统 RAM 不是现代计算机上最快的内存。在系统 RAM 和实际 CPU 之间有几个级别的缓存,底层操作系统和处理器会以块的形式将数据在缓存层次结构中上下移动。如果向上移动的块恰好包含系统接下来需要的部分数据……这是一个很大的胜利。将内存结构与空间结构相关联是提高这种胜利发生概率的一种方法。
27.3. 索引结构重要吗?¶
理论上,是的。实际上,并没有。只要索引是对数据的“相当好”的空间分解,性能的主要决定因素将是实际表元组的顺序。
“无索引”和“索引”之间的差异通常很大且高度可衡量。而“中等索引”和“优秀索引”之间的差异通常需要非常仔细的测量才能辨别,并且对正在测试的工作负载非常敏感。