mysql
三大范式
1NF: 每列字段的原子性的,不可再拆分(比如省市区)
2NF:满足1NF,表中的字段必须完全依赖于全部主键而非部分主键。
3NF:满足2NF,非主键外的所有字段必须互不依赖
但是开发中一般会进行字段冗余。减少表关联,降低开发难度。
乐观锁和悲观锁
mysql服务层结构
查询解析器
查询优化器
缓存
myql的索引
innodb:
myisam
mysql性能优化
注意:不设置优化器最大容量的话,可能会导致优化器返回的结果不全。
mysql为什么快
mysql底层数据结构b+tree
查到的节点数据是放到内存中的,这个速度是非常快的。
为什么不用b树,把b树的度设置的越大来降低树的高度
因为内存和硬盘的数据交换有个存储位,称为页,1页的大小为4k.一次交互只能是页的整数倍,页根据机器是有上限的。
mysql底层将一个数据节点的大小默认设置为4页,也就是16k
加入一次只能读1页,也就是16k.
度不是无上限的。
对比其他数据结构
二叉数(速度慢,单节点只有2个分叉)
红黑数(平衡二叉数)
hash
B-Tree
B+Tree(B-Tree变种)
InnoDB表必须有主键,并且推荐使用整型的自增主键
满足MySQL的索引数据结构B+树的特性,必须要有索引作为主键
整型占有的磁盘空间或内存空间相比字符串更少
整型比较比字符串比较更快速,字符串比较是先转换为ASCII码,然后再比较的。
B+树本质是多路多叉树
磁盘写数据快满了,是分配一页4k的数据,自增在写磁盘的时候容易分配到同一个磁盘扇区,范围查找更快
非主键索引叶子节点存储的是主键值
节省内存(一致性和节省存储空间)
myisam(非聚集)索引
表级锁
不支持事务
全文类型索引
不支持外键
叶子节点保存是数据指针(内存地址)
MyISAM索引文件和数据文件是分离的
主键和非主键索引之间,叶子节点保存的数据没有区别。
叶字节点数据保存的是数据指针,所以还多一次查找数据的步骤。
磁盘文件
表结构文件→test_myisam_frm
数据结构文件↔test_myisam_MYD
索引文件↔test_myisam_MYI
innodb(聚集)索引
行级锁
支持事务
不支持全文索引
支持外键
叶子节点保存是数据本身而不是数据指针。
主键保存的是完整的数据和主键索引
叶子节点保存的是主键值。避免数据重复和方便维护更新。
表数据文件本身就是按B+Tree组织的一个索引结构文件(ibd文件合并了索引和数据)
聚集索引-叶节点包含了完整的数据记录
数据文件本身就是索引文件(索引和数据保存在同一文件)
mysql单表行上限
myisam
InnoDB引擎
数据库性能
单机
集群
update可以用索引
insert无法用索引的
join应该用小表驱动大表,不要超过3张表以上的join,join的操作不能用做跨库的join