4.9. 数据库¶
4.9.1. 基础理论¶
关系数据库设计的三大范式¶
-
第一范式:数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;
第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
第三范式:必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);
4.9.2. MySQL¶
原理¶
-
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁
InnoDB¶
优化¶
索引¶
聚集索引, 非聚集索引¶
MyISAM 是非聚集,InnoDB 是聚集
复合索引¶
-
文中有一处错误:
对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高; select * from table1 where col1=A AND col2=B AND col3=D 如果使用 where col2=B AND col1=A 或者 where col2=B 将不会使用索引
原文中提到索引是按照“col1,col2,col3”的顺序创建的,而mysql在按照最左前缀的索引匹配原则,且会自动优化 where 条件的顺序,当条件中只有 col2=B AND col1=A 时,会自动转化为 col1=A AND col2=B,所以依然会使用索引。
自适应哈希索引(AHI)¶
explain¶
4.9.3. NoSQL¶
MongoDB¶
-
优点:弱一致性(最终一致),更能保证用户的访问速度;内置GridFS,支持大容量的存储;Schema-less 数据库,不用预先定义结构;内置Sharding;相比于其他NoSQL,第三方支持丰富;性能优越;
缺点:mongodb不支持事务操作;mongodb占用空间过大;MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方;
Hbase¶
-
空数据不存储,节省空间,且适用于并发。
-
rowkey 按照字典顺序排列,便于批量扫描。
通过散列可以避免热点。