MySQL支持多种数据类型,选择正确的类型是获得高性能的关键。
选择能保证应用正确的最小数据类型。 不要过分的低估所要存储的数据的长度,因为在应用运行之后在表的多个地方增加数据类型的长度(data type range)是非常痛苦的事情。 尽可能选择简单的数据类型,这样更节省CPU。 如整数(interger)就比字符(character)要简单。 两个简单的例子:存储日期时,使用MySQL内置的DATETIME类型比用字符串类型要好;用整形存储IP信息比用字符串好。 尽可能避免在数据库中存放NULL。 尽可能在对所有字段都做NOT NULL约束,除非是真的打算存储NULL。 对MySQL来说,很难优化可以为NULL的列——构造索引、索引统计和数据比较的时候更加复杂——存储的时候需要额外的空间并需要MySQL对其做特殊的处理。例如,在MyISAM引擎的表中,对可以为NULL的列加索引,每一项都需要额外的存储空间,并且使得索引变成变长索引——定长索引用整形存储,效率更高。 如果实在需要有NULL的存在,也可以考虑用“0”戒者空字符串来代替。 但是,把NULL-ABLE的列转换为NOT NULL所带来的性能提升也是有限的。所以,对于已经运营的应用,并不强制化大代价去做这样的优化。只是,如果是从头开始设计表的Schema,推荐使用这样的优化设计。
MySQL首先把数据分成了若干大类,如时间类型、数值类型和字符类型等。然后又在这些大类中细分了若干子类,如时间类型又分类DATETIME和TIMESTAMP。 列数据类型的选择步骤是,首先确定使用哪一种大类,然后再选择合适的子类。 不同子类适用于不同的引用类型。如同样是时间类型,DATETIME适用于做展示,而TIMESTAMP更适合做应用的内部逻辑。 |