0%

数据库范式

在说范式的规范之前先说明一下有哪些函数依赖

  • 完全函数依赖
    • X->Y,并且X的任何真子集都无法决定Y,那么Y对X完全函数依赖
    • 如 (学号,课程号)->成绩,学号或者课程号都无法单独决定成绩,是完全函数依赖的
    • 如果不是复合候选码,则一定是完全函数依赖
  • 部分函数依赖
    • X->Y,但X的其一真子集可以决定Y,那么Y对X部分函数依赖
    • 如 (学号,身份证号)->姓名,学号或者身份证号都可以单独确定姓名,是部分函数依赖
  • 传递依赖
    • X->Y,Y->Z,那么Z对X传递依赖

候选键:可以唯一标识所有属性的就是候选键,主键是从候选键中选出来的一个

主属性:候选键中包含的属性就是主属性

规范化理论

规范化理论

范式

第一范式1NF(属性原子性)

字段具有原子性,保证字段不可分

数据库表中的所有字段都是单一属性,不可再分

第二范式2NF(消除部分函数依赖)

在第一范式的基础上,非主属性完全依赖于候选键

阅读全文 »

MySQL系统调优

可以使用下面几个工具来做基准测试:

MySQL索引结构

mysql的查询速度主要看磁盘io的时间,所以需要尽可能的减少磁盘io的次数,这也是为什么会选用数才作为存储结构的原因O(logN)

MySQL内置的存储引擎对各种索引技术有不同的实现方式,包括:B+Tree,R-Tree索引、hash索引、full-text全文索引

  • Innodb中使用的是B+Tree索引,并不是找到一个给定键值的具体行,而是找到被查找的数据行所在的页,然后通过把页读入到内存,在内存中进行查找,最后得到要查找的数据
  • MyISAM中使用的是FullText全文索引, InnoDB在5.6之后支持,5.7之后使用ngram插件开始支持中文
  • Memory中使用的是Hash索引

索引结构

为什么不使用二叉树

二叉树可能会出现链表的方式存储,这样磁盘IO次数就变成了O(N)

为什么不使用红黑树

红黑树确实可以保证O(logN)的次数,但是其只有两个子节点,数据大的话树的深度太高了

为了减少深度,采用了B树,B树可以有N个孩子节点

B-Tree

阅读全文 »

内存溢出和内存泄漏

内存溢出

内存溢出(OutOfMemoryError,简称OOM)是指没有空闲内存,且垃圾收集器也无法提供更多的内存

出现OOM的原因有两种:

  • java虚拟机设置的堆内存不够
  • 代码中创建了大量大对象,并且长时间不能被垃圾收集器收集

内存泄漏

可达性分析算法来判断对象是否是不再使用的对象,本质是判断一个对象是否还被引用,内存泄漏是指对象不会被程序用到了,但是GC又无法回收这些对象的情况,内存泄漏会逐渐的占用内存,直至耗尽所有内存,最终出现OOM

阅读全文 »

MySQL查询缓存

MySQL在查询的时候首先会查询缓存,如果缓存命中的话就直接返回结果,不需要解析sql语句,也不会生成执行计划,更不会执行;如果没有命中缓存,则再进行SQL解析以及进行查询,并将结果返回(也同时将结果放入到缓存中)

MySQL查询过程

缓存查找是利用对大小写敏感的哈希查找来实现的,Hash查找只能进行全值查找(sql完全一致),如果缓存命中,检查用户权限,如果权限允许,直接返回,查询不被解析,也不会生成查询计划,由于在缓存更新的时候会对数据加锁,所以对于读写比较频繁的系统,建议关闭缓存

阅读全文 »