存储过程时一组为了完成特定功能的SQL语句集,经过编译后存储在数据库。用户通过指定存储过程的名字并给出参数来执行它。
优点:
①提高数据库的执行速度
②当对数据库进行复杂操作时,比如对多个表进行增删改查,可将此复杂操作用存储过程封装起来与数据库提供的事务一同使用。
③可以重读使用,减少数据库开发人员的工作量,安全性能高。
缺点: 复杂、不便于调试、不好应用缓存。
MyISAM: 表级锁定,不支持事务,没有主键
InnoDB: 行级锁定,支持事务,必须有一个主键(用户没有的话会产生一个主键)
索引简单的理解为排好序的快速查询的数据结构。
优点:
①类似于大学图书馆建书目索引,提高数据检索的速度,降低数据库的IO成本;
②通过索引对数据库的数据进行排序,降低数据排序的成本,降低IO功耗;
缺点:
①索引也是一张表,占用空间;
②索引大大提高查询速度,但是对数据进行增删改的操作时,mysql不仅要保存数据,还要保存索引文件每次更新添加了索引列的字段,调整更新带来的键值变化后的索引信息;
③索引只是提高效率的一个因素;
哈希索引:
哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
弊端:
①哈希索引并不是按照索引值顺序存储,无法用于排序;
②哈希索引不支持部分索引列匹配查找,因为哈希做因始终是使用索引列的全部内容计算哈希值的。
③不支持范围查找;
④如果出现哈希冲突,维护成本较高;
tip:简单解决哈希冲突:自己设计使用SH1()或MD5这两种强加密函数的返回值的一部分作为自定义哈希函数;
与二叉树相比
二叉树相比于顺序查找的确减少了查找次数,但是在最坏情况下,二叉树有可能退化为顺序查找。而且就二叉树本身来说,当数据库的数据量特别大时,其层数也将特别大。二叉树的高度一般是log_2^n,
B树的高度是log_t^((n+1)/2) + 1,其高度约比B树大lgt倍。n是节点总数,t是树的最小度数。
与B树相比
B树节点既保存key,又保存data,而B+树只有叶子结点保存key和data,非叶子结点只保存data,因此可以保存更多的额data,也就更‘矮胖’。B树在提高IO性能的同时,并没与解决元素遍历时效率低下的问题,正是为了解决这个问题,B+数应运而生。B+数只需遍历叶子节点即可实现整棵树的遍历,而B树必须使用中序遍历按序扫库,B+树支持范围查询非常方便。这才是数据库选用B+树的主要原因。
B+树索引:
原因有很多,最主要的是这棵树矮胖,呵呵。一般来说,索引很大,往往以索引文件的形式存储的磁盘上,索引查找时产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的时间复杂度。树高度越小,I/O次数越少。
①建立索引;
②避免对查询字段进行计算或者类型转换;
③减少表的连接,尽量避免使用left join 和right join,可以使用union;
④查询字段时不要返回*,需要查询 什么字段就使用什么字段;
④优化SQL:最好不要给数据库留 null,尽可能使用 not null。对查询进行优化,尽量避免全表扫描。在 where、order by 上建立索引。尽量避免在 where 子句中对字段进行表达式操作。尽量避免在 where 中使用or连接。
事务:事务是并发控制的基本单位。
事务是一个操作序列,这些操作要么都执行,要么都不执行。
属性(ACID):
①原子性(atomic);
②一致性(consistency);
③隔离性(isolation);
④持久性(durability)。
① read uncommitted:读未提交的
② read committed:读已经提交的
③ repeatable read:可以重复读
④ serializable:串行化
赃读:赃读是指一个事务读取到了另外一个事务已经修改但是没有提交的数据,比如事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。
幻读:幻读是指当事务不是独立执行时发生的一种现象。事务 a 和事务 b 同时操作一张表,事务 a 提交的数据也不能被事务 b 读到,就会造成幻读。比如事务T1修改一行数据后,这时候事务T2新增了一条数据,这时候A改结束了发现还有一条数据没有修改,就好像发生了幻觉一样;
赃读和幻读有点类似:
赃读是事务B读取了数据;
幻读是事务B新增了数据;
适合创建索引:
①主键创建唯一索引;
②频繁更新的字段不适合创建索引;
③查询中与其他表关联的字段,外键创建索引;
④排序、分组字段创建索引;
⑤ where条件里用不到的字段不创建索引;
⑥在高并发情况下,适合创建组合索引;
不适合创建索引:
①表数据很少;
②频繁增删改的表;
③如果某个字段有很多重复的字段,就不适合为这个字段创建索引;
内连接(inner join/join):内连接相当于取两个表的交集。
左连接 left join:左外连接,会把左边表里所有的数据取出来,而右边表中数据有相等的,就显示出来,没有就会补上 NULL。
右连接 right join:右外连接,会把右边表里所有的数据取出来,而左边表中数据有相等的,就显示出来,没有就会补上 NULL。
完全外连接 full join:相当于两个表取并集。
第一范式:强调的是列的原子性,即列不能够再分成其他几列。
第二范式:在满足第一范式的情况下,第二范式除主键外的每一列都必须完全依赖于主键。 第二范式就是在第一范式的基础上属性完全依赖于主键。
第三范式:在满足第二范式的情况下,除开主键列的其他列之间不能有传递依赖关系。