2011-06-09 134 views
0

我正在查看我正在继承的项目的数据库模式。有很多二进制答案被存储为INT(11)而不是TinyInt(1),这是我通常处理这种类型或存储的方式。MySQL存储和优化

我检查了数据,一切都是“1”或“0”。是否有任何理由要或不要将数据类型更改为TinyInt(1)对于所有这些实例,都是未签名的?

同样,如果像“姓氏”如果当前列允许为varchar(255),将切换为varchar(100)产生任何收益?我对性能/效率更感兴趣,而不是仅仅限制数据存储。

感谢, D.

回答

1

我会说肯定继续对布尔列的更改。 (注意:其实如果你使用的是MySQL 5+,我会使用bit数据类型而不是tinyint)。

就varchar列而言,它实际上并没有改变255到100的长度。

从SQL文档:

A柱使用一个长度字节如果 值不需要超过255字节, 2长度个字节,如果值可能需要 超过255个字节。

所以,只要它在255以下,你在内存存储方面真的没什么收获。这就是说,通过限制名称的大小,需要在SQL服务器和应用程序之间传输更少的数据。

+1

对varchar列**没有影响,只要它们没有索引**。 – Hammerite 2011-06-09 18:22:42

+0

我会想象这与传输速度有关,而不是内存分配,对吗? – Swift 2011-06-09 18:27:21

+0

我在问题中没有看到任何内容,表明传输速度是优先考虑的因素。但除此之外,我的印象是,保持指数很小会产生很多好处(虽然是的,主要好处是在内存占用)。 – Hammerite 2011-06-09 20:01:15

0

切换到TINYINT会为您节省3个字节,我相信,这似乎不是一个对我很重要,但它肯定是一个小更高效。

我总是尝试使VARCHAR列尽可能小,因为我可以逃脱。我会亲自关注你可以从中获得的任何收益。

我能想到的,以避免这些变化的主要原因是,如果你有一个运行的ALTER TABLE会导致显著的停机时间如此多的数据。

这些是否有助于您的应用更好地发挥作用,可以进行辩论。从理论上讲,使用VARCHAR时,MySQL只会通过线路发送实际数据,所以如果所有姓氏的长度都是40个字节,则只能发送40个字节。如果该列未在查找中使用,则不应该对您的性能产​​生任何影响。在SO上有几个相关的问题like this one已经涵盖了这个问题。

+0

3个字节是很多,如果你一百万/十亿行... – 2011-06-09 18:24:43

+0

可以肯定的相乘,它的很多,如果你需要通过电汇一百万行,但没有太多的每个记录的基础。 – muffinista 2011-06-09 18:28:24

+0

即使在硬盘上。如果你有一百万/十亿行,那么每行3个字节的总和就会增加到3MB/3GB ......我意识到存储是便宜的,但它不是存储除“比特”之外的任何布尔值的理由。 – 2011-06-09 18:30:13