本文试图从数据表创建的策略(schema)和索引的角度描述优化选择。
最优化数据类型
数据越小越好。选择满足需求的最小数据类型。通过节省更多的磁盘空间,内存以及cache,使得你的数据库更快。
选择简单的类型。整形值相比于字符型的代价较小,因为字符集和校对规则的关系。比如说应该存储日期和时间,而不是个字符串;IP地址也应该用数字保存。
尽可能的避免NULL。尽量把数据列定义为NOT NULL。可为NULL的列使得索引的实现更加复杂,查询更难优化。
整型
TINYINT SMALLINT MEDIUMINT INT BIGINT
字节 1 2 3 4 8
UNSIGNED属性可以修饰以上类型,而像INT(11)后面的11只是输出显示的位数,并不影响数据存储和计算。
实数
FLOAT和DOUBLE是浮点型,分别占4,8字节。如果要保存确切的数,需要DECIMAL类型。
DECIMAL类型以bit string的形式存储。尽量用前者,因为DECIMAL消耗更多的存储空间和计算时间。
字符串类型
不同的存储引擎对于CHAR和VARCHAR的实现是不同的。
VARCHAR:一般情况下VARCHAR只存储所需的字节空间,不过当MyISAM设置了FIXED 的ROW_FORMAT时例外。
VARCHAR在数据前用1~2字节来存储实际数据的长度。不过对于存储所需长度方法,当数据更新空间不够时会变得麻烦。
数据中的前导和后附的空格都存入和可读出。
CHAR: 不存储后面的空格。当存储少量的字符串或者数据长度较接近时,可以采用该类型。
尽量不使用BLOB和TEXT类型。
当值可以确定时,可用ENUM代替字符串类型。
索引
孤立WHERE字节中的列。意思就是条件语句中要想用上index,则该列不能处于左边的表达式中或函数中:如where id+1 = 5 。
对于过长的列使用前缀索引