我还有一个问题,但我会更具体。
我看到,选择一百万行桌子时,<1秒。我不明白的是它如何使用索引来做到这一点。搜索似乎需要 10 毫秒,因此要成功 1 秒,它必须执行 <100 次搜索。如果每行有一个索引条目,那么 1M 行至少有 1K 块来存储索引(如果每行 8 字节(32 位索引值 + 32 键偏移量),实际上它更高)。然后我们需要实际前往行并收集数据。数据库如何保持低搜索并尽可能快地提取数据?
一种方法是所谓的“聚集索引”,其中表的行根据聚集索引的排序进行物理排序。然后,当您想沿索引字段读取一系列值时,您会找到第一个,并且您可以一次读取所有值而无需额外的 IO。
还:
1)读取索引时,会一次性读入一大块索引。如果下降 B 树(或沿着底部的孩子移动,一旦你找到你的范围)将你移动到另一个已经读入内存的节点,你已经保存了一个 IO。
2) 如果 SQL 服务器在统计上期望检索的记录数量如此之多,以至于从索引到底层行的随机访问要求将需要如此多的 IO 操作,以至于执行表扫描会更快,那么它会改为进行表扫描。您可以使用 SQL Server 或 PostgreSQL 中的查询计划器来查看这一点。但对于小范围,索引通常更好,查询计划将反映这一点。