问题标签 [b-tree-index]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - postgres中解释的索引和过滤部分中的布尔列
我有一个带有布尔列的表 -"is_woman" bool DEFAULT true
我有这个列的 btree 索引(以及其他一些,如年龄、城镇等)-is_woman ASC NULLS LAST
我对此专栏有疑问 -is_woman IS FALSE
结果,我得到了解释:
为什么有两个 is_woman 条件?一个在索引部分,第二个在过滤器中?
更新
在@dmitry 的帮助下,我创建了两个部分索引:一个用于男性is_woman is false
,第二个用于女性is_woman is true
。
Explain
对于相同的查询:
Bitmap Index Scan on is_woman_woman_idx (...) (actual time=469.446..469.446 rows=406867 loops=1)
Index Cond: ((age >= 1) AND (town = 1))
Execution time: 1827.239 ms
没有Filter
部分,这个查询工作得更快:
- 实际时间
2.227..2754.378
→469.446..469.446
- 执行时间
2792.804 ms
→1827.239 ms
database - B 树和 B+树索引的区别
我正在研究 B+ 树和 B 树,我想了解有关它的两件事,如果有人可以向我澄清,我将不胜感激:
为什么我可以在 B+ 树索引上存储更多搜索键?我的猜测是原因是因为 B+ 树的节点指向子树而不是数据。
是否有任何类型的数据比较不适用于 B+ 树索引,或者我可以使用所有类型的数据(=、>=、!=、<、<>...)?
postgresql - Postgresql 不使用多列索引 (btree_gin)
我在使 postgres 使用我的多列索引使用 btree_gin 扩展进行完整搜索时遇到问题。这是用于文章的搜索页面。使用 btree_gin 背后的想法是能够获取 'id' 字段进行排序,并获得 magazine_id 作为过滤器:
Postgres 决定在杂志上使用 btree 索引,然后过滤(=慢):
然后,我发现更不了解的是,它也拒绝在 LIST 页面上使用这个简单的 btree 索引来查找文章,它们只是按每页的降序排列 x:
同样,它不使用多列索引:
编辑:以上是记录较少且只有 1 个杂志的开发设置,因此速度很快。这是生产服务器上由 auto_explain 生成的日志:
我将不胜感激任何人能给我进一步调试的提示。
mysql - MySQL - 使用 PRIMARY KEY - UNIQUE INDEX 相关表多对多
愉快的一天。
我正在创建一个电影数据库,所有电影都会为每个用户获得一票,对电影进行评估,“好,好或公平”这些投票存储在具有用户 ID 的表 [movies_has_rating] 中谁进行了投票,投票类型和创建日期,我需要确保并防止用户可以两次参与电影,因为每个用户只允许投一票,尽管我已经通过 PHP 和 MySQL 完成了查询,仍然有可能从 MySQL 手动添加它,并且还可以建立相同的默认 MySQL,我的问题是:
1)如果将字段定义为[vote id]和[user_id]作为主键,您可以避免对同一部电影的用户进行两次评估,例如。
2) UNIQUE INDEX [vote id]和[user_id]字段已经定义为主键时,需要添加,这在定义主键时使用UNIQUE INDEX的优点和区别。
3)需要指定索引的方法类型,如“ BTREE or HASH ”
非常感谢您的帮助,非常感谢!
c++ - 按文件夹名称存储键值对
我们有我们的内部 noSQL 数据库,它基本上将所有内容存储在一个紧凑的二进制文件中。现在,我需要一个类似于键值存储或 B+Tree 的数据结构。在我的情况下,问题是“价值”可以是不同的类型,并且大小非常不稳定,可能从 1Kb 到 1-2Gb。通常,键是字符串,值是数据流,可以是 int、string 或自定义类型的流。
我正在考虑实现 B+ 树,但这并不容易,因为 B+ 树需要“值”的类型相同,并且“值”的大小应该足够小,可以存储在相对较小的块中。可能有一个变体,但我没有找到关于如何实现 B+ 树的教程,其中包含显示如何存储在磁盘上的示例。我看到的大部分教程都只是内存中的 B+ 树。
然后我有了使用文件夹/文件名作为键的想法。然后该值可以是文件中的任何内容。然后值可以是任意大小,这就是我想要的。所以我的问题在这里,在极端情况下,
- 不同日期的数据存储在单独的文件夹中
- 我可以有 1M-50M 密钥(实际上是文件/文件夹)在磁盘上存储一天
- 对文件的数据操作通常是“只读”的,白天是“附加到”的。历史数据永远不会被修改。
我已经看到我可以在现代操作系统上拥有约 40 亿个文件,因此我对这种在单台机器上存储约 2 年的方法感到满意。我只是担心这种实现键值存储的方式是否非常糟糕?为什么?处理文件系统时我会遇到什么问题?(例如,Windows 上的框架磁盘?)
所有都在 Windows/Linux 中用 C++ 实现。
mysql - MySQL 在 dict0dict.cc 上获得长信号量锁 - 但在 DML 操作上
语境:
有一个包含 2 列整数 id 列的表 - 主键自动增量和一个长文本列。
许多不同的进程和连接同时从该表中添加、读取和删除行。根本没有 DDL 语句。只需插入、选择和删除 - 每个操作最多发生在 1 行。即插入单行,按主键选择单行,然后也按主键删除单行。
该表是 mysql 实例上的唯一表(这是在 docker 容器中)。
该表的填充行很少,ibd 文件的大小为 199G。
问题
我经常看到像这样的信号量锁
有时锁被持有超过 600 秒,innodb 故意崩溃。
查看 5.6.26 的代码 - dict0dict中的函数是
特别是:
问题
是什么导致了这些锁?
到目前为止尝试过
- 看到这是 b-tree 游标和字典之间的争用以及一些研究,我关闭了自适应哈希索引。问题仍然存在。
- 然后将缓冲池从默认的 128M 增加到 1G。问题仍然存在。
由于它是一个繁忙的表,我不想优化表,但如果这是答案 - 我想知道为什么。
mysql - MySQL 计算单个表的 RAM B+Tree 的足迹(与 python 数据结构比较)
我现在在 Python 中缓存了以下数据:
数据字符串大小约为 87 字节。以最佳方式将其存储在 python 中(使用 dict 并在带有分隔符的 data-str 前添加时间戳),每个条目的 RAM 成本约为 198 字节。这对于我需要的缓存大小来说是相当大的。
我想尝试在 MySQL 表中存储相同的内容,看看是否可以节省 RAM 空间。这样做时,我将其存储为:
我知道 MySQL 会将 InnoDB 表的索引(这就是我现在拥有的)加载到 RAM 中。因此,id(唯一)、时间戳和指向数据字符串的指针将驻留在 RAM 中。
如何仅为这个新表计算 MySQL 的 B+Tree 的完整 RAM 使用量(即包括元数据)?
database - 如何在磁盘上布局 B-Tree 数据?
我知道 B-Tree 如何在内存中工作,它很容易实现。但是,目前完全超出了我的范围,是如何找到在磁盘上有效工作的数据布局,例如:
- B-Tree 中的条目数可以无限增长(或至少超过 1000GB)
- 磁盘级复制操作被最小化
- 这些值可以有任意大小(即没有固定模式)
如果有人可以提供有关在磁盘级别布局 B-Tree 结构的见解,我将不胜感激。尤其是最后一个要点让我很头疼。我也很欣赏书籍的指针,但我见过的大多数数据库文献只解释了高级结构(即“这就是你在内存中的做法”),但跳过了磁盘布局的细节。
database - 如何在 b-tree 中索引可变长度字符串、整数、二进制文件?
我正在创建一个数据库存储引擎(为了好玩)。
我知道它使用 b-tree(和其他东西),但在所有 b-tree 基础示例中,它表明我们需要对键进行排序,然后将其存储用于索引,而不是整数。
我可以理解排序,但是如果我将字符串作为索引的键,如何对字符串进行排序?
例如:我想索引 btree 中的所有电子邮件地址,我该怎么做?
postgresql - PostgreSQL 索引物理布局
我试图了解 PostgreSQL 物理索引布局是如何的。我开始知道索引是作为具有 B 树数据结构的页面集的一部分存储的。我试图了解吸尘如何影响索引。它有助于控制它的大小吗?