我们正在从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的问题
其他问题
我知道B-Tree如何在内存中工作,它很容易实现.但是,目前完全超出我的是如何找到在磁盘上有效工作的数据布局,例如:
如果有人能够深入了解磁盘级布局B树结构,我将非常感激.特别是最后一个要点让我头疼不已.我也很欣赏指向书籍,但我见过的大多数数据库文献只解释了高级结构(即"这就是你在内存中的表现"),但是跳过了磁盘布局上的细节.
我有一个简单的表,其中有一个带有日期类型的 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) …
我有一个包含多个索引的表,其中几个重复相同的列:
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索引的大量例子的任何资源?
由于数据库数据在B树中以8k页组织,并且对于PK信息信息同样如此,因此数据库中的每个表应该可以计算B树的高度.从而揭示了达到某些数据所需的跳跃次数.
由于行大小和PK大小都非常重要,因此很难计算,因为例如 varchar(250)不需要占用250个字节.
1)有没有办法从SQL Server中获取信息?2)如果没有,是否可以使用分析数据库表的一些代码进行粗略估计?
我创建了类似的索引
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 …
我正在编写一个简单的工具来检查重复的文件(即具有相同数据的文件).机制是使用sha-512算法为每个文件生成哈希值,然后将这些哈希值存储在MYSQL数据库中.我在二进制(64)唯一非空列中存储哈希值.每行都有一个唯一的二进制哈希值,用于检查文件是否重复.
- 我的问题是 -
我可以在二进制列上使用索引,我的默认表排序规则是latin1 - 默认排序规则吗?
为了获得高性能,我应该使用哪种索引机制Btree或Hash?我需要每秒更新或添加100行.
我还应该注意哪些其他方面才能获得最佳性能?
我正在创建一个数据库存储引擎(为了好玩)。
我知道它使用 b 树(和其他东西),但在所有 b 树基本示例中,它表明我们需要对键进行排序,然后存储它以进行索引,而不是整数。
我可以理解排序,但是如果我有字符串作为索引的键,如何对字符串进行排序?
例如:我想索引 btree 中的所有电子邮件地址,我该怎么做?
database b-tree storage-engines b-tree-index data-structures
考虑下面的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) b-tree-index ×9
b-tree ×4
indexing ×3
postgresql ×3
database ×2
mysql ×2
collation ×1
date-range ×1
disk ×1
explain ×1
gist-index ×1
mongodb ×1
oracle ×1
performance ×1
primary-key ×1
sql ×1
sql-server ×1