![](/img/trans.png)
[英]In MySQL, does the designated size of TEXT or BLOB affect performance or table size?
[英]Mysql: Does field size/display width affect index performance?
CREATE TABLE student(
`id` int(11) auto_increment PRIMARY KEY
`grade` int(11)
)
假设我想在grade
列上添加索引。 如果它具有较小的显示宽度,例如int(4)
,它会有所不同吗?
编辑:
这里的performance
是指查询时间。
另外,不清楚列显示宽度是否影响索引大小。 我们正在考虑一个至少有数百万行的非常大的表。 如果答案可以阐明这一点,那就太好了。
首先,显示在任何情况下都没有区别——它只是关于字段在查询响应中的表示方式。 一个int
仍然和int
使用 4 个字节,一个bigint
是一个使用 8bytes 的bigint
等等......
您从什么方面考虑“性能”? 保持数据和索引加载或缓存所需的总请求时间、内存使用情况? 磁盘空间?
我猜你的意思是,它会影响查询响应的速度。
然而,这个问题非常广泛,真正的答案是,这取决于。 你的系统是64位还是32位? 我们在谈论多少记录? 该字段是一个更大的复合索引的一部分,但仍然是它的一小部分吗?
(注意:需要对此声明进行检查,例如 CHAR 是否只是针对索引进行散列)从 a 或 CHAR(4) 转到 CHAR(32) 并确保您可能会发现一些不可忽略的性能影响,但这不是由于复杂性,但您的操作系统和架构处理这些的额外开销。
但是,我将大胆提出建议,除非更改类型(int 到 varchar),否则可能会更改索引方法或索引存储大小的大量更改,否则您可能不会“看到”任何区别。 我怀疑在不同的整数类型之间您是否能够轻松地显示一致的减速。
简短回答: (4)
对INT
没有任何意义。
龙哥 回复:
列大小影响行大小,从而影响表大小,进而影响查询速度。 但...
如果表“小”,则性能差异很小。
如果该表大于 RAM 中可以缓存的大小,则差异可能很大——因为您可能会受到 I/O 限制。 在某些情况下,这是十倍的减速。
要缩小始终为 4 个字节的INT
,请切换到TINYINT UNSIGNED
(1 个字节,范围:0..255)、 SMALLINT UNSIGNED
(2 个字节,0..65K)或MEDIUMINT UNSIGNED
(3 个字节,0..16M) )。
假设grade
是 0..100,那么TINYINT
(有符号或无符号)是最佳的。
同时,您可以更改您的更改id
。
INT(4)
的唯一目的是与ZEROFILL
结合使用,您希望将 12 显示为0012
。 这是极其罕见的。
除非字符串是真正固定长度的字符串,否则不要使用CHAR
。 然后它可能应该明确声明为CHARACTER SET ascii
因为它是十六进制、所有数字或 2 个字母的 country_code(等)。 无论如何,utf8 是矫枉过正。
假设您使用的是 InnoDB,“次要” INDEX(grade)
将隐式包含PRIMARY KEY(id)
。 所以每个索引条目的大小是grade
的大小加上id
的大小加上一堆开销。 假设成绩正常且学生不超过 65K,您可以使用 3 个字节而不是原来的 8 个字节。但表很小,因此您不太可能受到 I/O 限制。 因此 8 而不是 3 的开销很小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.