1.int类型后边的括号中的值并不会影响其存储值的范围,仅仅指示了整数值的显示宽度。例如int(8)和int(10)的存储范围都是-2147483648~2147483647。当你选择了填充零时,才能看出区别。
2.主键自增id适合设置为无符号的int类型,这样最大值可以增加一倍:4294967295(2的32次方减一)。
3.要建立索引的字段最好设为NOT NULL,当然其他字段也最好这样做。
4.varchar的长度肯定时越短越好,不要使用默认的255,更长的列会消耗跟多的内存。
5.char类型存储的数据长度小于最大长度时会用空格填充,检索时再剔除,因此如果存入的string最后有空格,查询出来是没有的。
6.Memory引擎不支持blob和text类型字段,如果列表查询使用了blob或text的列且使用了临时表排序,那么将会使用磁盘临时表,严重影响性能。
7.时间戳格式timestamp和datetime,前者占用空间小(4bytes)且与时区相关,优先使用。除非是范围超过了timestamp的范围(1970~2038),不推荐使用int类型。
8.推荐使用枚举类型(enum)来替代字符串(如性别男女),但注意其实际存储的是整数(1,2,…对应字段值顺序),排序也是按照整数大小排序,而非映射的字符串。
9.经常变动的列不适合使用枚举类型,因为Alert Table对于数据量大的表来说,性能是不得不考虑的一件事情。
10.IPv4地址可以保存为无符号int类型,因为它实际上是一个32位的无符号整数,使用mysql函数(INET_ATON和INET_NTOA)进行转换。
11.范式与反范式的使用并不是绝对性的,需要根据自己的业务和数据量合理折中使用。数据量大查询频率高的时候适当的建立冗余字段减少关联,而数据少关联紧密的场合遵循范式化设计。
12.sql中limit 5
表示搜索前五条记录,limit 5,10
检索6-10条记录,limit 5,-1
表示6-last条记录。
13.多表联查count
统计时,尽量根据查询条件减少连表的数量,数量越少查询时间越少,少一个表(假如这个表数据量很大或者属于别的库那优化的效果更好)可能减少至少一半的时间。
14.Mysql是不支持嵌套事务
的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务。要使用嵌套事务可以通过代码控制开启次数计数,最后提交时判断计数。
待续。。。