- mysql数据库引擎
- 数据库授权
mysql数据库引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。**MySQL的核心就是存储引擎**。
MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE 等,可分别根据各个引擎的功能和特性为不同的数据库处理任务提供各自不同的适应性和灵活性。
1.MySQL常见数据库引擎,InnoDB(MySQL默认引擎)和MyISAM
InnoDB是事务型存储引擎,提供了对数据库ACID事务的支持,并实现了SQL标准的四种**隔离级别**,具有行级锁定(这一点说明锁的粒度小,在写数据时,不需要锁住整个表,因此适用于**高并发**情形)及外键支持(所有数据库引擎中独一份,仅有它支持外键)该引擎的设计目标便是处理大容量数据的数据库系统,MySQL在运行时InnoDB会在内存中建立缓冲池,用于缓存数据及索引。
> InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。**InnoDB是默认的MySQL引擎**。
相比起InnoDB,没有提供对数据库事务的支持,不支持细粒度的锁(行锁)及外键,当表Insert与update时需要锁定整个表,因此效率会低一些,在高并发时可能会遇到瓶颈,但MyIsam引擎独立与操作系统,可以在windows及linux上使用。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。
MyIASM缺点:不能在表损坏后恢复数据
2.ACID事务
1. **原子性(Atomicity)**:事务是一个原子性质的操作单元,事务里面的对数据库的操作要么都执行,要么都不执行。
2. **一致性(Consistency)**:在事务开始之前和完成之后,数据都必须保持一致状态,必须保证数据库的完整性。也就是说,数据必须符合数据库的规则。
3. **隔离性(Isolation)**:一个事务的执行不能被其他事务干扰。即一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. **持久性(Durability)**:持久性也成为永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久的。
3.四种隔离级别
**1.读未提交(Read Uncommitted)**:在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)
**2.读已提交(Read Committed)**:这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(NonrepeatableRead),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果
**3.可重复读(Repeatable Read)**:这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
**4.可串行化(Serializable)**:这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争
4.何为脏读,幻读,不可重复读
**脏读**
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
![](image\脏读.png)
> T2时刻,事务B把原来张三的成绩由原数据80改为了70,此后又被T3时刻的事务A读取到了,但是T4时刻事务B发生异常,进行了回滚操作。**这个过程,我们称70为脏数据,事务A进行了一次脏读。**
- **不可重复读**
不可重复读,有时候也会说成“读已提交”。什么意思呢,就是在一个事务内,多次读取同一个数据,却返回了不同的结果。实际上,这是因为在该事务间隔读取数据的期间,有其他事务对这段数据进行了修改,并且已经提交,就会发生不可重复读事故。
![](image\不可重复读.png)
> 图示中事务A在T1和T4查询同一语句,却得到了不同的结果,这是因为T2~T3时刻事务B对该数据进行了修改,并提交。**这个过程,出现了在一个事务内两次读到的数据却是不一样的,我们称为是不可重复读。**
**不可重复读**和**脏读**的区别:前者是“读已提交”,后者是“读未提交”
- **幻读**
幻读是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。举个例子,某事务在检查表中的数据数count时,是10,过一段时间之后再查是11,这就发生了幻读,之前的检测获取到的数据如同幻觉一样。
出现幻读和不可重复读的原因很像,都是在多次操作数据的时候发现结果和原来的不一样了,出现了其他事务干扰的现象。**但是,幻读的偏重点是添加和删除数据,多次操作数据得到的记录数不一样;不可重复读的偏重点是修改数据,多次读取数据发现数据的值不一样了。**
![](image\幻读.png)
> 事务B向表中新插入了一条数据,事务A在T3时刻后查询数据的时候,突然发现数据和以前
5.MyIASM适用场景
- MyIsam极度强调快速读取
- MyIsam表中自动存储了表的行数,需要时直接获取即可
- 适用于不需要事物支持、外键功能、及需要对整个表加锁的情形
数据库授权
select * from user
8.0版本
新增用户,只有mybatis_ssm的使用权限,组长
1.创建用户
create user zuzhang;
2.用户设置密码
alter user 'zuzhang'@'%' identified with mysql_native_password by '123456';
3.用户要赋权
grant all on mybatis_ssm.* to zuzhang@'%'
4.增加权限
grant all on yiliao.* to zuzhang@'%'
5.删除用户
DROP user zuzhang;
6.收回部分权限
revoke all on yiliao.* from zuzhang@'%';
可进行增删改查
select * from user
8.0版本
新增用户,只有mybatis_ssm的使用权限,组长
1.创建用户
create user ni;
2.用户设置密码
alter user 'ni'@'%' identified with mysql_native_password by '123456';
3.用户要赋权
grant select on mybatis_ssm.* to ni@'%'
4.增加权限
grant select on yiliao.* to ni@'%'
5.删除用户
DROP user ni;
6.收回部分权限
revoke all on yiliao.* from ni@'%';
只能查询