在b树中,您可以将密钥和数据存储在内部和叶节点中,但是在b +树中,您必须仅将数据存储在叶节点中.
在b +树中执行上述操作有什么好处吗?
为什么不在任何地方使用b-trees而不是b + tree,直觉上它们似乎更快?
我的意思是,为什么你需要在b +树中复制密钥(数据)?
我们正在从MySQL迁移到PGSQL,我们有一个1亿行表.
当我试图确定两个系统使用多少空间时,我发现表的差异要小得多,但发现索引存在巨大差异.
MySQL索引比表数据本身占用更多的大小,而postgres使用的是相当小的大小.
在挖掘原因时,我发现MySQL使用B +树来存储索引,而postgres 使用 B树.
MySQL的索引使用情况略有不同,它将数据与索引一起存储(由于增加的大小),但postgres没有.
现在的问题是:
比较数据库上的B树和B +树,最好使用B +树,因为它们更适合范围查询O(m)+ O(logN) - 其中范围中的m和B +树中的查找是对数的吗?
现在在B树中,对于范围查询,查找是对数的,因为它没有数据节点的链接列表底层结构,所以它会射到O(N).话虽如此,为什么postgres使用B树?它是否适用于范围查询(确实如此,但它如何在内部处理B树)?
上面的问题来自postgres的观点,但从MySQL的角度来看,为什么它比postgres使用更多的存储,在现实中使用B +树的性能优势是什么?
我本可以错过/误解很多事情,所以请随时纠正我的理解.
编辑回答Rick James的问题
其他问题
我的表 Report 有 10 多列,其中除自动增量 id 之外的每个字段都是 varchar。表中任何行的最大大小约为 80000 字节。
我观察到以下 2 个查询之间存在相当大的差异,其中服务器和客户端都位于同一系统上(大约 150 万行)(列名上也有索引)
select * from Report;
Run Code Online (Sandbox Code Playgroud)
&
select name from Report;
Run Code Online (Sandbox Code Playgroud)
我经历了其他 stackoverflow 问题,Ans 建议
“选择特定列更好的原因之一是它提高了 SQL Server 可以从索引访问数据而不是查询表数据的可能性。”
我的问题是:
1)即使在使用索引时,我们也需要从实际的数据库(即磁盘)中读取数据,因此当我们选择单列或多列(假设使用*)时,将执行相同的磁盘I/o。
2)有人可以用很少的内部知识解释为什么单列选择和多列选择之间存在差异。据我了解,数据库尝试将完整的行存储在同一磁盘扇区中。
假设对用户表进行一些查询,例如
select first_name from user &
select first_name, age from user
Run Code Online (Sandbox Code Playgroud)
3)数据库是否执行相同的磁盘I/O(对于上述查询),或者磁盘I/O可能不同,如果用户表有超过10列并且我们选择5~8列,但磁盘I/O保持不变怎么办?
已经在其他答案中读到,使用 select * 并不可取,它可能会导致视图和维护问题(向数据库添加新列时的情况)
这可能是一个愚蠢的问题,因为仍在学习数据库(学科新手)。如果某些问题已在任何地方得到解答,请提供链接。
database ×2
mysql ×2
postgresql ×2
b-tree ×1
b-tree-index ×1
performance ×1
sql ×1
sql-server ×1