相关疑难解决方法(0)

数据库实现细节 - 每行标头开销

提示这个问题的问题与创建类似于构建IR系统时使用的巨大倒置指数有关.IR社区的一般口号是关系数据库不适合构建IR系统.无论如何,在查看posgres时,行元组开销是23字节+填充(请参阅" Postgres常见问题解答 "中的"从典型文本文件存储数据需要多少数据库磁盘空间?" ).这对我的工作来说太大了(不缩放).

顺便提一下,我的数据集是17个文本,需要4-5个表,具体取决于问题的切片方式.我记得在sqlite中尝试了一个模式,db文件打破了100个演出

我很想知道Sql Server/MySql/Sqlite/Berkeley db(所有访问方法)/ Berkley Db的sqlite3接口/ Kyoto,Tokyo db和Firebird的每行开销是多少.任何一个人都无法回答我猜的问题,除非有人像我一样好奇地调查此事.

编辑

  • Postgres - 23(OMG!)byte tuple header + padding.
  • bdb-hash:26字节页面开销,6字节密钥/数据开销(组合).
  • Bdb-btree:26字节页面开销,10字节密钥/数据开销(组合).
  • MySql Innodb:这里分析(5字节标题+事务id +滚动指针=每行18个)注意到自己:为什么事务ID出现在磁盘上?什么是滚动指针?
  • Sql Server:从这里开始.捕获变量元素长度,具有静态数据类型的行会产生非常适度的开销.开销估计很大程度上取决于模式和数据的性质.变量元素越大,开销越大.

database database-design data-modeling

6
推荐指数
0
解决办法
709
查看次数

平均行长超出可能

这不是InnoDB表大小为什么比预期的大得多的重复项 该问题的答案指出,如果我未指定主键,则将6个字节添加到该行。我确实指定了一个主键,这里有6个以上的字节来解释。


我有一个表,该表预期有数百万条记录,因此我密切注意了每一列的存储大小。 每行应占用15个字节(smallint = 2个字节,date = 3个字节,datetime = 8个字节)

CREATE TABLE archive (
  customer_id smallint(5) unsigned NOT NULL,
  calendar_date date NOT NULL,
  inserted datetime NOT NULL,
  value smallint(5) unsigned NOT NULL,
  PRIMARY KEY (`customer_id`,`calendar_date`,`inserted`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

该表现在有50万条记录,并且存储空间超出了预期。我运行此查询以从系统中获取更多详细信息:

SELECT *
  FROM information_schema.TABLES
 WHERE table_name = 'archive';


information_schema.index_length = 0
information_schema.avg_row_length = 37
information_schema.engine = InnoDB
information_schema.table_type = BASE TABLE
Run Code Online (Sandbox Code Playgroud)

怎么样!?

我原本希望每行15个字节,而这需要37个字节。 谁能给我一个下一个查找说明的想法吗?我已经阅读了很多有关Thais的文章,并且看到了一些有关在行大小上增加6或10个字节的解释,但这并不能解释22个额外的字节。

一种解释是索引也会占用存储空间。该表上没有索引。

一种解释是,information_schema.tables查询返回了不可靠的行数,这会抛出avg_row_length。我已经针对count(*)查询检查了它正在使用的行数,并且只差了一点(1%的1/20),所以这不是全部。

另一个解释是碎片。值得注意的是,该表是通过sql转储重建的,因此没有任何更新,插入和删除操作。

mysql storage

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