首页 > 解决方案 > 如何在数据库 b 树上执行带有组合子句的 SQL 操作

问题描述

我了解了 B 树如何对数据库有用的基本知识,因为它们保证 O(log(n)) 插入/删除,允许以有序的方式存储数据,并且在从磁盘检索数据时比二叉搜索树更有效。

因此,我想我或多或少地了解例如如何独立执行这些操作:

SELECT * FROM posts ORDER BY upvotes WHERE upvotes > 100

在这里,我猜测存储posts记录的树键是upvotes,所以我们可以找到下限upvotes = 100。一旦我们找到了具有此键的节点,只需从该点遍历树的其余部分即可。

SELECT * FROM posts WHERE id = ?

由于id是唯一的,因此它是find基于id键的树上的操作。

问题 1:那么,如果这是上述操作的工作方式,那么数据库是否为每一列保留一个 b 树,以便表记录中的数据以各种可能的方式排序?

问题2:如何执行组合子句的操作,假设:

SELECT * from posts WHERE upvotes > 100 AND downvotes < 5

我不明白如何有效地做到这一点。

提前致谢

标签: databasedatabase-design

解决方案


这些都会因数据库供应商而异。假设某种 SQL 变体:

问题 1 - 数据库通常为您的 PK 和您明确告诉它的任何其他索引保留某种 B 树。其他一些操作可能也可能不会创建索引。例如,唯一约束通常通过创建索引来实现。我不知道默认情况下会在每一列上创建索引的任何数据库。

问题 2 - 要查找给定数据库的详细信息,请查看如何获取查询计划,然后阅读文档。它通常会给你一个很好的主意。例如,有时您会看到索引搜索,然后是扫描和对剩余记录的过滤器。有时仅表扫描是最好的(或唯一的)计划。还有提供更多选择的列存储。

一般来说,要回答这些问题几乎是不可能的。


推荐阅读