MySQL学习笔记

事务

什么是事务

事务就是将一组SQL语句放在同一批次内去执行

如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行

MySQL事务处理只支持InnoDB和BDB数据表类型

原子性(Atomic)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

一致性(Consist)

事务前后数据的完整性必须保持一致

隔离性(Isolated)

事务的隔离性是指多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰

多个并发事务之间要相互隔离

持久性(Durable)

持久性是指一个事务一旦被提交,它对数据库的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

事务的隔离级别:

脏读:指一个事务读取了另一个事务未提交的数据

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同

虚读:是指在一个事务内读取到别的事务插入的数据,导致前后读取不一致

索引
索引的作用:

1.提高查询速度

2.确保数据的唯一性

3.可以加速表和表之间的连接,实现表与表之间的参照完整性

4.使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间

5.全文检索字段进行搜索优化

分类:

1.主键索引(Primary Key)

2.唯一索引(Unique)

3.常规索引(Index)

4.全文索引(FullText)

主键索引:

主键:某一个属性组能唯一标识一条记录

特点:

最常见的索引类型

确保数据记录的唯一性

确定特定数据记录在数据库中的位置

唯一索引:

作用:避免同一表中某数据列中的值重复

与主键索引的区别

主键索引只能一个

唯一索引可能有多个

常规索引:

作用:快速定位特定数据

index和key关键字都可以设置常规索引

应加在查询找条件的字段

不宜添加太多常规索引,影响数据的插入,删除和修改操作

全文索引

快速定位特定数据

注意:

只能用于MyISAM类型的数据表

只能用于CHAR,VARCHAR,TEXT数据列类型

适合大型数据集

索引准则

索引不是越多越好

不要对经常变动的数据加索引

小数据量的表建议不要加索引

索引一般应加在查找条件的字段

索引的数据结构:


hash类型的索引:查询单条块,范围查询慢
b tree类型的索引:b++树,层数越多,数据量指数级增长(mysql一般用它,InnoDB默认支持)


InnoDB 支持事务,支持行级锁定,支持 B-tree,Full-text 等索引,不支持 Hash索引
MyISAM 不支持事务,支持表级别锁定,支持 B-tree,Full-text 等索引, 不支持 Hash 索引
Memory 不支持事务,支持表级别锁定,支持 B-tree,Hash 等索引,不支持Full-text 索引
NDB 支持事务,支持行级别锁定,支持Hash索引,不支持B-tree,Full-text等索引
Archive 不支持事务,支持表级别锁定,不支持B-tree,Hash,Full-text 等索引

B+树和B树的差异:

B+树非叶子节点仅具有索引作用,有关信息均存放在叶子节点上

B+树的所有叶子节点构成一个有序链表,可以按照元素排序的次序遍历全部记录

B树和B+树的区别在于,B+树的非叶子节点只包含导航信息,不包含实际的值,所有的叶子节点和相连的节点用链表相连,便于区间查找和遍历

B+树的优缺点:

B+树的层级更少:非叶子节点存储的关键字更多,查询数据更快

B+树查询速度更稳定:B+树所有数据地址都在叶子节点上

B+树天然具备排序功能:叶子节点构成有序链表,在查询大小区间的数据时更方便,数据紧密度很高,缓存的命中率也会比B树高

B+树全节点遍历更快:B+树只要遍历叶子节点即可,B树要全树遍历

B树相当B+树的优点:如果信息离根节点很近,呢么查询它就比较块

这两个数据结构都用到了二分思想

MyISAM引擎使用B+Tree作为索引结构,叶子节点的data域存放的是数据记录的地址

InnoDB索引也使用B+Tree作为索引结构,但具体实现方式却不相同

InnoDB的数据文件本身就是索引文件,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址

在InnoDB中,数据文件本身就是按B+Tree组织的一个索引结构,这颗树的叶子节点保存了完成的数据记录,InnoDB表数据文件本身就是主索引,InnoDB的数据文件本身要按主键聚集,索引InnoDB要求表必须有主键(MyISAM可以没有)

InnoDB的辅助索引data域存储相应记录主键的值而不是地址,innoDB所有辅助所有都引用主键作为data域

MySQL索引背后的数据结构及算法原理学习链接:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

聚合函数

COUNT() 计数
SUM() 求和
AVG() 平均值
MAX() 最大值
MIN() 最小值

三大范式

问题 : 为什么需要数据规范化?

不合规范的表设计会导致的问题:

信息重复

更新异常

插入异常

无法正确表示信息

删除异常

丢失有效信息

第一范式 (1 NF):要求数据库表的每一列都是不可分割的原子数据项

第二范式(2 NF):数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关

第三范式(3 NF):在2NF基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

第1个图不满足3范式,因为费用依赖宿舍,宿舍依赖学号

第二个图满足

规范化和性能的关系

为满足某种商业目标 , 数据库性能比规范化数据库更重要

在数据规范化的同时 , 要综合考虑数据库的性能

通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间

通过在给定的表中插入计算列,以方便查询

参考:

https://www.cnblogs.com/wsg25/p/9615100.html

https://blog.csdn.net/qq_33369905/article/details/105926576

https://blog.csdn.net/qq_30631063/article/details/81633915

https://blog.csdn.net/dengjili/article/details/82468576

你可能感兴趣的:(MySQL学习笔记)