提示这个问题的问题与创建类似于构建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的每行开销是多少.任何一个人都无法回答我猜的问题,除非有人像我一样好奇地调查此事.
编辑
这不是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转储重建的,因此没有任何更新,插入和删除操作。