AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 246935
Accepted
sanjihan
sanjihan
Asked: 2019-09-05 01:15:42 +0800 CST2019-09-05 01:15:42 +0800 CST 2019-09-05 01:15:42 +0800 CST

InnoDB 中记录指针的大小?

  • 772

我正在尝试按比例增加冗余属性和性能增益。尽管存储冗余信息会导致许多异常,但我只关注冗余属性的大小与在不同表中存储指向另一个元组的指针(或引用)。

那么InnoDB Mysql系统中元组指针的大小是多少呢?我发现 MyISAM 使用 6 个字节。InnoDB 也一样吗?作为参考,6 个字节使得在单独的表中存储 3 个 SMALLINT(每个 2 个字节)在存储方面毫无意义。也许一个等价的问题是:记录地址的大小是多少?

mysql innodb
  • 1 1 个回答
  • 201 Views

1 个回答

  • Voted
  1. Best Answer
    Rick James
    2019-09-05T09:26:26+08:002019-09-05T09:26:26+08:00

    MyISAM默认为索引中的数据指针使用 6 个字节。索引指针默认为 5 个字节。您所指的“6”是从 .MYI 文件到 .MYD 文件的字节偏移量。这不一定与您的其他问题相关。

    InnoDB 要复杂得多。它不使用指针,只使用列。

    数据存储在按 .排序的 BTree 中PRIMARY KEY。(实际上是一个 B+树。)

    二级索引存储在单独的 BTree 中,每个节点记录中都有 PK。

    FK 只是指示的列,用于在其他表中的合适索引中进行查找。

    id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
    

    占用 1 个字节,加上一些开销

    id VARCHAR(255) CHARSET utf8mb4 PRIMARY KEY,
    stuff1 VARCHAR(255) CHARSET utf8mb4,
    stuff2 VARCHAR(255) CHARSET utf8mb4,
    INDEX(stuff1, stuff2)
    

    最后这个二级索引占用了 3*(2+255)*4+? 字节——

    • 3 列(stuff1、stuff2、id)
    • 2——长度
    • 255 -- utf8mb4的最大字符长度
    • 4 -- utf8mb4 中的最大字节/字符
    • +?-- 有开销;这各不相同。

    回到“指针”。在较低级别有一些“指针”:

    • 4 字节块指针(16KB 块),因此表大小限制为 64TB。
    • 指向溢出数据的 20 字节指针(用于指向一个大的TEXT或BLOB.
    • 块内的一些 1 字节和 2 字节长度或指针。
    • ?交易 ID 的字节数。(参见 MVCC 等)

    根据经验,InnoDB 表占用的磁盘空间是等效的 MyISAM 表的 2-3 倍。

    那么InnoDB Mysql系统中元组指针的大小是多少呢?

    • 如果TINYINT UNSIGNED足够(另一个表中最多 255 个项目),则将其视为每个表中的 1 个字节,再加上目标表中每个辅助键的 1 个字节。
    • INT经常使用(通常有超过 20 亿的限制),将其视为每个 4 个字节。

    也许一个更重要的问题是是否在AUTO_INCREMENT表上有一个“代理”( ) id。统计这个表和其他表的引用次数,判断它的大小。并使用其中最小的味道INT是安全的。

    这带来了 ids 的“燃烧”。在几乎所有情况下,INSERT(及其变体)将首先分配它可能需要的 auto_inc id。如果它没有全部使用它们(例如 for INSERT IGNORE),则 ID 将丢失(烧毁)。这可能导致耗尽,TINYINT比预期快得多。对于批量标准化,我提供了这种技术:http: //mysql.rjweb.org/doc.php/staging_table#normalization

    • 1

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve