mysql/mariadb的每条记录的磁盘开销是多少?(我最感兴趣的是InnoDB,但任何引擎都会很有趣)
假设你有一个
CREATE TABLE tbl (
id BIGINT NOT NULL PRIMARY KEY
);
显然,这将使用至少8字节(BIGINT)每条记录,但它会使用更多的每条记录吗?
开销很大。
- 每16KB块:几个指针,标志等
- 每行:大约24个字节的链接,交易的东西等。甚至,如果一行同时被多个事务触及。
- 每列:1或2字节长度和null。是的,即使是8字节的BIGINT。
- PRIMARY KEY:这是相当低的,因为PK与数据聚集在一起;它加起来约占整个表格的1%。
- 辅助键:每个辅助键(
INDEX(...)
)包含指定的列,加上一个PK列的副本。它是一个单独的b树。因此,由于这个原因,可能有多个BIGINT副本占用磁盘空间。 - InnoDB初始分配16KB块(数据和每个二级索引分开)。之后,它会预先分配更大的块。我认为您的样例表将使用16KB,直到其中有几百行。
- InnoDB不释放空间回给操作系统。也就是说,如果插入1000行,那么表将扩展为几个块。然后,如果您删除所有的行,磁盘空间不会缩小。
除了索引,bigint的8字节,加上其他列的类似计算可以加起来。但是你必须乘以2到3才能得到InnoDB表所需的磁盘空间。(当然,也有小于2x或大于3x的例外)
我很乐意讨论其他的例子,但我不能非常精确。