文本列应该移到最后?

时间:2012-07-19 16:31:34

标签: mysql sql database performance memory-alignment

如果动态行向末尾移动,则获取数据的速度是否有任何差异。

示例:int,int,int,text优于int int text int?

我的主管告诉我这个事实,从互联网上怎么没有这样的信息?请帮忙吗?

2 个答案:

答案 0 :(得分:3)

这是由于数据对齐。 INT占用4个字节,因此32位(相当于4个字节)处理器将处理4字节序列中的数据。能够以最适合处理器的顺序提取数据将导致更快的结果和更好的性能。

参考http://en.wikipedia.org/wiki/Data_structure_alignment

现在,这是通过通信通道传输数据时经常遇到的问题(因为某些编译器通常会通过将保留字节添加到4字节对齐某些成员来优化数据结构)。但是,MySQL还会将NDBCLUSTER引擎考虑为4字节对齐。这意味着,通过将TEXT结构置于INT值之间,您可以强制执行比必要更多的数据检索。

因此:

INT INT INT INT TEXT的处理速度将超过INT INT TEXT {{1 }} INT因为处理器可以立即检索16个字节(四个INT),而不必担心INT的大小。

有关详细信息,请参阅 MySQL文档

http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html

答案 1 :(得分:1)

TEXTBLOB数据不会与列本身存储在同一空间中。它们存储在为此目的保留的特殊区域中。

这些列始终检索速度较慢,但​​减速量会因系统调整和数据负载而有很大差异。有时这是无关紧要的,有时会导致严重的颠簸。请注意,如果你可以管理它,你应该在VARCHAR字段上使用短TEXT字段,blob字段的长度不会是免费的。

话虽如此,TEXT列作为指向实际数据的指针存储在行中,这使得它们在大多数情况下明显小于VARCHAR。如果您不选择它们,它们就不会被加载,并且您不需要进行额外的搜索来组装它们的数据。

为了确保这适用于您的MySQL版本和您的调优,请构建两个充满代表性数据的大型表并自行进行基准测试。