我们在定义表结构时或者在对表进行修改时,需要注意一些东西
数据类型
- 使用越大数据类型,则会使用更多的内存,所以在选择数据类型时就尽量考虑合适的类型
- Mysql在存储char类型数据时,会删除所有的末尾空格
- Mysql在存储Text和Blob类型数据时,是当做一个对象进行存储的,当值太大时,InnoDB会使用专门的“外部”存储区域来进行存储。
- 时间类型有两种datetime和timestamp,datetime能保存大范围的值,从1001年到9999年,精度为秒;timestamp能保存1970以来的秒数,由于只使用4位字节的存储空间,所以最大只能存储2038年,当超过这个范围,在插入或者修改时就会报错。
- 选择行标识符时,尽量选择性能好的类型,例如整数型。
- 使用不同的类型的标识符进行连表,性能可能会不一样
范式和反范式
在教科书上,一般都会追求范式,一级、二级等等。但是在实际中,过度的范式,会导致过多的连表,导致索引失效、查询时间增加、开发难度等问题,所以一般都需要两者相结合,例如增加缓存表或者汇总表,可以通过触发器来进行自动维护。
使用alter table
在使用alter table时,需要注意它极大可能会导致表的重建,表的重建会锁住整张表,导致数据库的性能整体下降,特别是大表,我在实际工作中,给一张上亿行的表增加过字段,需要3个小时才能完成,而且也出现了性能上的问题。