相关疑难解决方法(0)

B树和B +树之间的差异

b树中,您可以将密钥和数据存储在内部和叶节点中,但是在b +树中,您必须将数据存储在叶节点中.

在b +树中执行上述操作有什么好处吗?

为什么不在任何地方使用b-trees而不是b + tree,直觉上它们似乎更快?

我的意思是,为什么你需要在b +树中复制密钥(数据)?

database data-structures

281
推荐指数
10
解决办法
23万
查看次数

Postgres使用btree索引与MySQL 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的问题

  • 我正在使用InnoDB引擎用于MySQL
  • 我在填充数据后构建了索引 - 就像我在postgres中所做的那样
  • 索引不是UNIQUE索引,只是普通索引
  • 没有随机插入,我在postgres和MySQL中都使用了csv加载,只有在此之后我创建了索引.
  • 索引和数据的Postgres块大小是8KB,我不确定MySQL,但我没有改变它,所以它必须是默认值.
  • 我不会把行称为大,他们有大约4个文本字段,长度为200个字符,4个十进制字段和2个bigint字段 - 19个数字长.
  • PK是一个包含19个数字的bigint列,我不确定它是否笨重?在什么尺度上应区分笨重而非笨重?
  • MySQL表大小为600 MB,Postgres大约310 MB,包括索引 - 如果我的数学运算正确,这相当于大48%的大小.但是有没有办法可以在MySQL中单独测量索引大小,不包括表大小?这可能会导致更好的数字.
  • 机器信息:我有足够的RAM - 256GB以适应所有的表和索引,但我认为我们根本不需要遍历这条路线,我没有看到它们两个都有明显的性能差异.

其他问题

  • 当我们说碎片发生?有没有办法去碎片化,以便我们可以说除此之外,没有什么可做的.顺便说一句,我正在使用Cent OS.
  • 有没有办法在MySQL中测量索引大小,忽略主键,因为它是聚类的,这样我们实际上可以看到什么类型占用更大的大小(如果有的话).

mysql postgresql performance b-tree b-tree-index

28
推荐指数
2
解决办法
1822
查看次数

为什么单列选择和多列选择之间存在性能差异

我的表 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 * 并不可取,它可能会导致视图和维护问题(向数据库添加新列时的情况)

这可能是一个愚蠢的问题,因为仍在学习数据库(学科新手)。如果某些问题已在任何地方得到解答,请提供链接。

mysql sql database sql-server postgresql

2
推荐指数
1
解决办法
2529
查看次数