database - 如何在数据库 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
我不明白如何有效地做到这一点。
提前致谢
解决方案
这些都会因数据库供应商而异。假设某种 SQL 变体:
问题 1 - 数据库通常为您的 PK 和您明确告诉它的任何其他索引保留某种 B 树。其他一些操作可能也可能不会创建索引。例如,唯一约束通常通过创建索引来实现。我不知道默认情况下会在每一列上创建索引的任何数据库。
问题 2 - 要查找给定数据库的详细信息,请查看如何获取查询计划,然后阅读文档。它通常会给你一个很好的主意。例如,有时您会看到索引搜索,然后是扫描和对剩余记录的过滤器。有时仅表扫描是最好的(或唯一的)计划。还有提供更多选择的列存储。
一般来说,要回答这些问题几乎是不可能的。
推荐阅读
- python - 如何使用 python 从数据库中删除 () 或数字
- python - 仅包含文本的子图
- databricks - 将 databricks notebooks.dbc 转换为标准 .py 文件
- facebook-graph-api - Facebook 营销 API 中是否有获取某个地区所有城市列表的功能?
- linux - bash 循环遍历没有扩展名的文件
- linux - 让一个程序通过 ssh 执行另一个程序
- python - tensorflow 增强树分类器多类
- excel - VBA Excel 代码 - Windows 弹出窗口打开或保存
- ios - 如何使用 swift 和 Xcode 开发 iOS 应用程序来读取和写入同一个文件
- python - 如何在 Python 中正确定义函数?