标签: b-tree-index

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
查看次数

如何在磁盘上布置B-Tree数据?

我知道B-Tree如何在内存中工作,它很容易实现.但是,目前完全超出我的是如何找到在磁盘上有效工作的数据布局,例如:

  • B-Tree中的条目数可以无限增长(或至少大于1000GB)
  • 磁盘级复制操作最小化
  • 值可以具有任意大小(即没有固定的模式)

如果有人能够深入了解磁盘级布局B树结构,我将非常感激.特别是最后一个要点让我头疼不已.我也很欣赏指向书籍,但我见过的大多数数据库文献只解释了高级结构(即"这就是你在内存中的表现"),但是跳过了磁盘布局上的细节.

database b-tree disk b-tree-index

12
推荐指数
1
解决办法
3652
查看次数

PostgreSQL 日期范围未正确使用索引

我有一个简单的表,其中有一个带有日期类型的 user_birthday 字段(可以是 NULL 值)

CREATE TABLE users
(
  user_id bigserial NOT NULL,
  user_email text NOT NULL,
  user_password text,
  user_first_name text NOT NULL,
  user_middle_name text,
  user_last_name text NOT NULL,
  user_birthday date,
  CONSTRAINT pk_users PRIMARY KEY (user_id)
)
Run Code Online (Sandbox Code Playgroud)

该字段上定义了一个索引(btree),其规则为 NOT user_birthday IS NULL。

CREATE INDEX ix_users_birthday
  ON users
  USING btree
  (user_birthday)
  WHERE NOT user_birthday IS NULL;
Run Code Online (Sandbox Code Playgroud)

为了跟进另一个想法,我添加了扩展btree_gist并创建了以下索引:

CREATE INDEX ix_users_birthday_gist
  ON glances.users
  USING gist
  (user_birthday)
  WHERE NOT user_birthday IS NULL;
Run Code Online (Sandbox Code Playgroud)

但它也没有影响,因为据我所知,它不用于范围检查。

PostgreSQL 版本为 9.3.4.0 (22) Postgres.app ,问题也存在于 9.3.3.0 (21) …

postgresql indexing date-range b-tree-index gist-index

7
推荐指数
1
解决办法
8968
查看次数

数据库索引:为什么配对

我有一个包含多个索引的表,其中几个重复相同的列:

Index 1 columns: X, B, C, D
Index 2 columns: Y, B, C, D
Index 3 columns: Z, B, C, D
Run Code Online (Sandbox Code Playgroud)

我对实践中的索引知识不是很了解,所以我想知道是否有人可以解释为什么X,Y和Z与这些相同的列配对.B是生效日期.对于特定生效日期,C是该表的半唯一密钥ID.D是标识该标识符C的该记录的优先级的序列.

为什么不创建6个索引,每个X,Y,Z,B,C,D一个?

我想在另一个列T中添加一个索引,但在某些情况下我只会单独查询T而在其他情况下我也会指定B,C和D列...所以我应该只创建一个索引以上或我应该为T创建一个,为T(B,C,D)创建一个?

谷歌搜索索引的全面报道时,我没有像预期的那样运气.我能通过解释和B-tree索引的大量例子的任何资源?

sql oracle indexing b-tree-index

6
推荐指数
2
解决办法
244
查看次数

在SQL Server中查找表的B树的高度

由于数据库数据在B树中以8k页组织,并且对于PK信息信息同样如此,因此数据库中的每个表应该可以计算B树的高度.从而揭示了达到某些数据所需的跳跃次数.

由于行大小和PK大小都非常重要,因此很难计算,因为例如 varchar(250)不需要占用250个字节.

1)有没有办法从SQL Server中获取信息?2)如果没有,是否可以使用分析数据库表的一些代码进行粗略估计?

sql-server b-tree primary-key sql-server-2008 b-tree-index

6
推荐指数
1
解决办法
2654
查看次数

Postgres 不使用日期字段索引

我创建了类似的索引

CREATE INDEX bill_open_date_idx ON bill USING btree(date(open_date));
Run Code Online (Sandbox Code Playgroud)

和,

Column      |            Type
open_date   | timestamp without time zone
Run Code Online (Sandbox Code Playgroud)

并解释分析如下

情况1

explain analyze select * from bill where open_date >=date('2018-01-01');
Run Code Online (Sandbox Code Playgroud)
CREATE INDEX bill_open_date_idx ON bill USING btree(date(open_date));
Run Code Online (Sandbox Code Playgroud)

案例2

explain analyze select * from bill where open_date>='2018-01-01';
Run Code Online (Sandbox Code Playgroud)
Column      |            Type
open_date   | timestamp without time zone
Run Code Online (Sandbox Code Playgroud)

案例3

explain analyze select * from bill where date(open_date) >='2018-01-01';
Run Code Online (Sandbox Code Playgroud)
explain analyze select * from bill where open_date >=date('2018-01-01');
Run Code Online (Sandbox Code Playgroud)

我对为什么会发生这种情况做了足够的研究,但在任何地方都没有适当的解释。只有情况 3使用了我创建的索引,其他情况则不然。为什么会发生这种情况?

据我的理解,情况 2 …

postgresql b-tree-index

6
推荐指数
1
解决办法
3478
查看次数

我应该在二进制数据类型列mysql上使用哪个索引

我正在编写一个简单的工具来检查重复的文件(即具有相同数据的文件).机制是使用sha-512算法为每个文件生成哈希值,然后将这些哈希值存储在MYSQL数据库中.我在二进制(64)唯一非空列中存储哈希值.每行都有一个唯一的二进制哈希值,用于检查文件是否重复.

- 我的问题是 -

  1. 我可以在二进制列上使用索引,我的默认表排序规则是latin1 - 默认排序规则吗?

  2. 为了获得高性能,我应该使用哪种索引机制Btree或Hash?我需要每秒更新或添加100行.

  3. 我还应该注意哪些其他方面才能获得最佳性能?

mysql indexing collation b-tree-index

4
推荐指数
1
解决办法
4570
查看次数

如何在 b 树中索引可变长度字符串、整数、二进制文件?

我正在创建一个数据库存储引擎(为了好玩)。

我知道它使用 b 树(和其他东西),但在所有 b 树基本示例中,它表明我们需要对键进行排序,然后存储它以进行索引,而不是整数。

我可以理解排序,但是如果我有字符串作为索引的键,如何对字符串进行排序?

例如:我想索引 btree 中的所有电子邮件地址,我该怎么做?

database b-tree storage-engines b-tree-index data-structures

4
推荐指数
1
解决办法
2034
查看次数

为什么MongoDB不能使用与查询非常相似(不精确)的复合索引?

考虑下面的Mongo索引策略和查询,

指数:

db.collec.ensureIndex({a:1,b:1,c:1});
Run Code Online (Sandbox Code Playgroud)

查询:

db.collec.find({"a":"valueA"},{"_id":0,"a":1,"c":1}).sort({"c":-1}).limit(150)
Run Code Online (Sandbox Code Playgroud)

上述查询的解释返回:

/* 0 */
{
    "cursor" : "BtreeCursor a_1_b_1_c_1",
    "isMultiKey" : false,
    "n" : 150,
    "nscannedObjects" : 178,
    "nscanned" : 178,
    "nscannedObjectsAllPlans" : 279,
    "nscannedAllPlans" : 279,
    "scanAndOrder" : true,
    "indexOnly" : true,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 1,
    "indexBounds" : {
        "a" : [ 
            [ 
                "valueA", 
                "valueA"
            ]
        ],
        "b" : [ 
            [ 
                {
                    "$minElement" : 1
                }, 
                {
                    "$maxElement" : 1
                }
            ]
        ],
        "c" : [ 
            [ 
                {
                    "$minElement" …
Run Code Online (Sandbox Code Playgroud)

mongodb explain b-tree-index mongodb-query mongodb-indexes

3
推荐指数
1
解决办法
478
查看次数