事务
什么是事务
事务就是将一组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