mysql事务,索引,视图,三大范式,存储过程和函数,体系结构,存储引擎,锁
程序员文章站
2022-05-30 09:47:11
...
一. 事务原理
1.当用户登录成功后,系统会创建一个临时的日志文件,日志文件是用来保存事务的状态。
2. 如果没有开启事务,所有的操作都会直接写到数据库中,不会使用日志文件。
3. 如果开启了事务,所有的操作都会写到日志文件中。
4. 如果用户提交了事务,则日志文件中的所有操作都会写到数据库中。
5. 如果用户回滚事务,则日志文件中的数据会被清空,不会提交到数据库中。
事务的四大特征
原子性:包装的一组sql(一组业务逻辑)是一个不可分割的单位,事物的操作要么都发生,要么都不发生。
一致性:一个事物在执行之前和执行之后,数据库都必须处于一致性状态。
隔离性:多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发的事务之间要相互隔离。
持久性:指事物一旦被提交,对数据库中的改变是永久的。哪怕数据库中发生异常,重启数据库,数据依然存在。
事务的并发访问引发的三个问题
脏读:一个事物读取到另一个事务未提交的数据
不可重复读:一个事务两次读取的数据内容不一致。主要由于update引起。
幻读:一个事务两次读取的数据条数不一样,主要由于update/delete引起的。
事务的隔离级别
读未提交
读已提交(oracle默认隔离级别)
可重复读(mysql默认隔离级别)
串行化
二. 索引
1:定义:索引是帮助mysql高效获取数据的数据结构(有序)。
索引分类
1.主键索引:主键约束+提高查询效率
2.唯一索引:唯一约束+提高查询效率
3.普通索引:仅提高查询效率
4.组合索引:多个字段组成索引
5.hash索引:solr,es
6.全文索引:根据key-value查找,效率非常高
索引的优缺点
优势:
1.类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。
2.索引顶层就是排序,通过索引对数据进行排序,降低数据排序的成本,降低cpu消耗。
劣势:
1.在数据库建立过程中,需花费较多的时间去建立并维护索引,特别是随着数量的增加,所花费的时间不断递增。
2.在数据库中创建索引需要占用一定的物理存储空间,这其中就包括数据表所占的数据空间以及所创建的每一个索引所占用的物理空间。
3.在对表中的数据进行修改时,例如对其进行增加,删除或者是修改操作时,索引还需要进行动态的维护,这给数据库的维护速度带来了一定的玛法。
索引创建原则
1.字段内容可辨识度不能低于70%,字段内数据唯一值的个数不能低于70%
2.经常使用where条件搜索的字段。
3.经常使用表连接的字段(内连接,外连接 ),可以加快连接的速度。
4.经常排序的字段 order by ,因为索引已经是排过序的,这样一来可以利用索引的排序,加快排序查询速度。
mysql使用B+Tree好处:
1.降低树的高度
2.叶子节点按照索引排好序,支持范围查找,速度会很快
3.还有一点是mysql将根节点都加载到内存中,每张表有一个根节点,大小是16kb,这样的好处是如果是千万条数据,查询只需要2次磁盘IO。
三.视图
视图和表的区别
视图数据: 不占用物理空间,仅仅保存的是sql逻辑,磁盘上只有数据结构,没有数据
表:占用物理空间。
视图的好处
1.sql语句提高了重用性,效率高
2.和表实现了分离,提高了安全性,使用视图的用户只能访问他们被允许查询的结果集
四.三大范式
1.第一范式:表中的每一列不能在拆分
2.第二范式:满足第一范式的基础上,一张表只描述一件事情,表中的每一列都完全依赖于主键
3.满足第二范式的基础上,取消传递依赖
五.存储过程和函数
1) 存储过程:将一段代码封装起来,然后使用的时候直接调用即可。
2)mysql中的存储过程和函数是一组预先编译并存储在数据库中的sql语句的集合,我们可以通过调用存储过程和函数来执行一组sql语句的集合。
3) 好处:提高代码的重用性,简化操作,减少编译次数并且减少了和数据库服务器的连接次数,提高了效率。
4)通过declare声明变量和set赋值
5)select...into赋值
6)存储过程if条件判断 if....elseif.....else....end if;
7)存储过程传递参数: in(输入参数) out(输出参数) inout(即可作为输入参数,也可以作为输出参数)
8)存储过程case结构 case when 值1 then 语句1;【when 值2 then 语句2】... else 语句3 end case;
9)存储过程三种循环:
while循环(while 循环条件 do sql语句 end while)
repeat (repeat sql语句 util 循环条件 end repeat);
loop语句 (循环标记:loop sql语句 end loop 循环标记)
delimiter $
create procedure pro_test9(in num int)
begin
declare total int default 0;
declare n int default 1;
while n<=num do
set total = n+total;
set n=n+1;
end while;
select total
end $
delimiter $
create procedure pro_test10(in num int)
begin
declare total int default 0;
declare n int default 1;
repeat
set total=total+n;
set n=n+1;
until n>num
end repeat;
select total;
end $
delimiter $
create procedure pto_test9()
begin
declare total int default 0;
declare n int default 1;
aa:loop
set total=total+n;
set n=n+1;
if n>num then leave aa;
end if;
end loop aa;
select total;
end $
六.体系结构
1. Connector:客户端连接器,实现不同的语言,不同的客户端连接mysql服务;
2. Connection Pool:连接池,主要管理客户端的连接线程的,核心功能:1.限制连接线程的上线 2.内存检查 3.线程复用等;
3. Sql Interface:sql 接口层,主要用于接收客户端发送过来的sql语句
4. parser:sql解析器,主要解析sql的语法是否正确,以及sql权限的校验
5. optimizer:优化器组件,主要决定一次查询是否要走索引,以及走哪个索引;
6. Pluggable storage Engines:存储引擎层,mysql采用可插拔式的设计思想,用户可以根据自己的选择,选取指定的存储引擎,同时mysql存储引擎是真正构建索引,数据的存储,删除,更新,添加等都是存储引擎层的工作;
exit:caches&buffer:缓存层,主要缓存客户端查询的数据的,但是如果客户端发生增删改操作,会清空所有缓存,导致维护成本增加,所以mysql8以后,去除缓存层;
七.存储引擎
1. 概述:存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式;存储引擎是基于表的,而不是基于库的,所以一个库中不同的表可以指定不同的存储引擎。
2. Innodb特点:支持外键,支持事务,支持外键,支持行锁(支持表锁)聚集索引 数据和索引放在一块
Myisam特点:支持表锁(不支持行锁),不支持事务,不支持外键;非聚集索引,数据和索引不放在一块
八.锁
1.从对数据操作的粒度分:
表锁:操作时,会锁定整个表,类似于java中HashTable
行锁:操作时,会锁定当前操作行
2.从对数据操作的类型分
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
写锁(排他锁):当前操作没有完成之前,它会阻断其他线程的写锁和读锁。
3.行锁升级到表锁
1)在索引字段中使用函数,导致索引失效;
2)在索引字段下进行类型转换
3)在索引字段中使用数学运算
上一篇: Fedora下Zend Studio 6.1.2 的配置_PHP
下一篇: 三大范式&JDBC