mysql三大范式:
第一范式:列不可分解
第二范式:唯一索引
第三范式:引用主键
读未提交:事物还没有提交,而其他事物会读取该事务没有提交的缓存的数据,这就是脏读
读已提交:就是只能读已经提交了的数据。事件A读取初始数据,在这个间隔中事件B也开始读取了初始数据,事件A对初始数据进行了操作,但是还没有提交,因此事物B是获取不到事件A操作后的数据,导致事件B还是查询的是初始数据,所以当事件A和事件B读取出来的数据就会不一样,这就造成了虚读。
可重复读:这是Mysql的事物隔离级别,就是在A事物读取的时候,B事物也去读取,但是B事物并不能对数据进行更新,但是可重复读,有个问题就是,只是禁用了update操作,并没有禁用insert,所以这就会造成幻读
串行化:事物的每一次读取都要等待前一个事物的结束才会执行,会导致效率低
二事物的隔离级别:
读未提交:就是在事物A在操作数据的时候,会有一个缓存,导致了事物B去缓存中读取了数据:
读已提交:就是在事物A在操作数据的时候,操作了但是还没有提交,然后事物B又读取了数据,对其进行操作,并提交,这就导致事物A操作的数据不一致
可重复读:就是在事物A对数据进行操作的时候,事物B不能对数据进行修改操作,但是只是禁用了修改更新操作,并没有禁用插入操作
串读:就是要执行事物B,那么事物A必须要全部执行后才能执行事物B,这就会导致效率很慢
三Mysql数据库事物的ACID特性:
1:原子性:就是事物执行要么全部执行,要么全部不执行
2:一致性:就是在执行事物的时候,事物各位置的执行状态保持一致
3:隔离性:就是在运行事物A的时候,与其他事物隔离
4:持久性:就是只要你事物运行完成,不管出现什么系统异常,数据还是保持不变。
数据库中锁
行级锁操作主要的就两个:
- 排它锁(写锁):在事物A在对数据获得排它锁时,可以对数据进行读写操作,但是其它事物就不能对数据进行加锁读写操作了。
添加行级写锁
select * from 表名 where 条件 for update
- 共享锁(读锁):在事物A在对数据获得共享锁时,可以对数据进行读操作(不能对数据进行写操作),其他事物也可以对数据进行一个加锁读的行为。
添加行级读锁
select * from 表名 where 条件 lock in share mode
表锁:
添加表锁
lock tables 表名 read
删除表锁
unlock tables
关于Mysql中的搜索引擎的区别:
- Innodb:支持表锁和行锁,并且这是一个事物性的搜索引擎,拥有热备份的功能,在数据恢复中要比mysiam要快,支持外键,并且可以在索引中添加数据(主索引是聚簇索引),避免从磁盘直接读取数据,从而读的速度要比MyISAM要快。
- MyISAM:支持表压缩和空间索引
关于Innodb中索引的创建:
1.如果在表中创建了主键,那么就会根据主键来创建索引
2.如果在表中没有创建索引,那么就会根据,没有为空的字段来创建索引
3.如果上面两种都没有,那么Innodb就会自己虚拟创建一个索引