MySql 字段类型有那些
int、varchar 、char 、datetime、 timestamp、 text、 blob 、decimal。
其中,数据库建表时应该选择最小、最简单的数据类型为标准。
blob用来存储二进制数据,没有排序规则和字符集;text用来存储字符串数据,有排序规则和字符集;对于Memory而言,他不支持这两种数据类型,会导致某些查询使用临时表。
对于varchar、char,varchar存储时有产生碎片的可能,因为在更新操作时有可能新的字符串长度比原来的更长,如果页内没有更多的空间存储,MyISAM会将行拆成不同的片段存储;而InnoDB会分裂页来使行可以放进页内。
而且需要额外的1或者2个字节(255个字节)来存储字符串的长度;
所以,对于频繁变更的字段以及非常短的列,都适合使用char而不是varchar来存储数据;而且,对于可变长字符串,其在临时表和排序时可能悲观的按照最大长度分配内存。
数据库设计的三范式
范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。
三范式
- 第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列).
例如:
user表的联系方式(contact)这一列分为电话号(phone)和地址(address)两列,这样才符合第一范式。
-
第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)
-
第三范式(3NF):满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B, B ->C, A -> C)。
完全的遵循三范式会导致执行过多的关联操作,而反范式会导致执行过大的distinct操作。
每个属性不可再分;非主属性依赖于主属性;消除传递依赖
数据库架构
常见的有主从同步、读写分离架构、水平切分架构
读写锁耦合在一起,对读写性能都不高。
- 读写分离,解决“数据库读性能瓶颈”问题
- 水平切分,解决“数据库数据量大”问题