rostamiani Asked: 2018-07-18 19:28:08 +0800 CST2018-07-18 19:28:08 +0800 CST 2018-07-18 19:28:08 +0800 CST 使用 tinyint 而不是 int 作为主键是否有性能优势? 772 当我知道此表中的行数有限但此键将用作另一个大表中的外键时,使用 tinyint 而不是 int 作为主键是否有性能优势?(我将在查询中使用很多连接)我正在使用 MySQL。例如,这是我模型的一部分: mysql performance 1 个回答 Voted Best Answer Willem Renzema 2018-07-18T20:29:58+08:002018-07-18T20:29:58+08:00 是的,使用 TINYINT 与 INT 相比有性能优势。 设计您的表以最小化它们在磁盘上的空间。这可以通过减少写入磁盘和从磁盘读取的数据量来带来巨大的改进。较小的表通常需要较少的主内存,而它们的内容在查询执行期间被主动处理。表数据的任何空间减少也会导致可以更快处理的更小的索引。 阅读我从中提取该段落的文档的整个页面以获取更多信息。 对于您的特定情况,在 company 表中使用 TINYINT 而不是 INT 将意味着 project 表中的外键将是 5 个字节,而不是 8 个。这是因为所有辅助键都包括表本身的主键 - 这以便它可以查找主键记录并获取更多信息。(这导致了关于聚集索引、覆盖索引和双重查找的讨论。) 因此,如果您将通过此外键加入或过滤公司表,那么您将为每个索引条目使用 5/8 的空间,这意味着您将能够容纳大约 8/5 的每个索引条目页面查找,这意味着必须将更少的页面加载到内存中来处理任何给定的查询。 一般来说,越小越好。不是为了磁盘空间使用本身,而是为了当您需要将数据加载到内存中以进行连接和 WHERE 子句过滤器时。 也就是说,TINYINT 非常小。你确定你永远不需要超过 256 家公司吗?我个人的经验法则是对您将拥有多少条记录进行最佳猜测,然后选择 10 倍或更大的数据类型。为什么?因为人们既不擅长估计,也不擅长预测未来的用例。SMALLINT 或 MEDIUMINT 可能会避免您在将来切换时感到痛苦。 所以,选择小,但要足够大,使其不太可能很快(或者最好是永远)改变。
是的,使用 TINYINT 与 INT 相比有性能优势。
阅读我从中提取该段落的文档的整个页面以获取更多信息。
对于您的特定情况,在 company 表中使用 TINYINT 而不是 INT 将意味着 project 表中的外键将是 5 个字节,而不是 8 个。这是因为所有辅助键都包括表本身的主键 - 这以便它可以查找主键记录并获取更多信息。(这导致了关于聚集索引、覆盖索引和双重查找的讨论。)
因此,如果您将通过此外键加入或过滤公司表,那么您将为每个索引条目使用 5/8 的空间,这意味着您将能够容纳大约 8/5 的每个索引条目页面查找,这意味着必须将更少的页面加载到内存中来处理任何给定的查询。
一般来说,越小越好。不是为了磁盘空间使用本身,而是为了当您需要将数据加载到内存中以进行连接和 WHERE 子句过滤器时。
也就是说,TINYINT 非常小。你确定你永远不需要超过 256 家公司吗?我个人的经验法则是对您将拥有多少条记录进行最佳猜测,然后选择 10 倍或更大的数据类型。为什么?因为人们既不擅长估计,也不擅长预测未来的用例。SMALLINT 或 MEDIUMINT 可能会避免您在将来切换时感到痛苦。
所以,选择小,但要足够大,使其不太可能很快(或者最好是永远)改变。