2017-01-16 48 views
2
CREATE TABLE student(
`id` int(11) auto_increment PRIMARY KEY 
`grade` int(11) 
) 

假设我想在grade列上添加一个索引。如果显示宽度较小,是否有所作为,例如int(4)Mysql:字段大小/显示宽度是否会影响索引性能?

编辑:

  • 通过performance这里我指的查询时间。

  • 此外,不清楚列显示宽度是否会影响索引大小。我们关心的是一张至少有数百万行的非常大的桌子。如果答案能够解决这个问题,那将会很棒。

+0

“int(4)”将完全不做任何事情,除非将完全可用的“int”字段变为不可用的信息段。数百万行不是很大,而是在小范围内。数据库的性能将取决于您的I/O子系统和CPU的速度,而不是您是否在这里或那里削减一个或两个字节。数据库旨在保存数据并利用它,通过降低其字​​段的有用性来设计数据库的性能并非正确使用该工具。你在错误的地方进行优化,特别是如果你打算为你的数据库使用一台服务器。 –

回答

1

首先,显示在任何情况下都没有什么区别 - 这只是字段在查询响应中的表示方式。一个int仍然使用4个字节int,一个bigintbigint使用8个字节等等

从哪些方面你考虑“表演”?总体请求时间,内存使用需要保持数据和索引加载或缓存?磁盘空间?

我猜你的意思,它会影响查询回应的速度。

但是这个问题相当广泛,真正的答案是,这取决于。你的系统是64位还是32位?我们正在谈论多少条记录?场是一个更大的复合索引的一部分,但仍然是它的一小部分? (注意:需要对此声明进行检查,就像如果CHAR仅针对索引进行散列处理一样)从CHAR或CHAR(4)到CHAR(32),确保您可能会发现一些不可忽略的性能问题,但这不是由于复杂性,而是由于操作系统和体系结构的额外开销。但是,我将要走出一条腿,并建议,除非更改可能会改变索引方法或索引存储大小变化的类型(int到varchar),否则您可能不会'看'有什么区别。我怀疑在不同的整数类型之间你可以很容易地显示一致的减速。

+0

感谢您的回复。任何原因为什么你发布第二个响应而不是第一个编辑? –

+0

是通过perf。我的意思是查询响应时间。 –

+0

@JunjiZhi我认为这是一个SO的错误。 – Ray

0

简短回答:(4)对于INT没有任何意义。

过长...回答:

列大小影响行的大小,这会影响表的大小,这会影响查询的速度。但是...

如果表格“小”,性能差异很小。

如果表大于可以在RAM中缓存的大小,那么差别可能会很大 - 因为您可能会受I/O限制。在某些情况下,这是一个十倍的放缓。

收缩一个INT,其是4个字节总是,切换到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,因为它是十六进制,全部数字或两个字母的country_code(etc)。无论如何,utf8是矫枉过正。

假设您使用的是InnoDB,“辅助”INDEX(grade)将隐式包含PRIMARY KEY(id)。所以每个索引条目的大小是grade的大小再加上大小id加上一堆开销。假设正常成绩,并且从未超过65,000名学生,则可以使用3个字节而不是原来的8个字节。但该表很小,因此您不太可能受到I/O限制。因此,对于8而不是3而言,开销很小。

相关问题