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