日常积累Mysql

Posted 顶子哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日常积累Mysql相关的知识,希望对你有一定的参考价值。

mysql相关

事务的特性以及隔离级别

ACID

原子性(Atomicity)说明事务是一个不可再分的工作单位,一个事务中的操作 要么全部成功 要么全部失败回滚
一致性(consistency) 是指事务必须使数据库从一个一致性状态转变到另一个一致性状态,说明事务前后数据的完整性必须保持一致
隔离性(isolation) 一个事务在进行内部操作和使用数据时对于其他的并发事务是隔离的,互不干扰,其他事务也不能干扰
持久性(Durability) 是指一个事务一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障,修改的数据也不会小时,并且后续的操作不会对已经提交的事务产生影响

脏读 不可重复读 幻读

脏读:
读取了一条无效的数据,例:甲的工资为5000 事务A将其修改为8000 但并未提交事务,这时候 事务B来读取甲的工资,读取为8000,但是此时事务A进行了回滚,这时工资为8000成为脏数据,事务B进行了一次脏读

不可重复读:
是指在同一个事务中的多次读取同一数据由于其他事务的修改影响而导致的数据读取结果不一致,例:事务A中读取了甲的工资为5000,操作还未完成,事务A还未提交,事务B将甲的工资改为8000,并提交了事务B,这是事务A再次读取甲的工资为8000。在一次事务中的两次读取结果不一致,导致了不可重复读
幻读:
发生在事务并发执行时,事务不是独立执行时发生的一种现象.例:公司里工资为5000的有10人,事务A读取工资为5000的有10人,操作未结束,事务A未提交,此时 事务B插入一条工资为5000的数据 事务A再次读取工资为5000的有11人,产生了幻读。
不可重复读与幻读相似但有所不同
不可重复读强调了数据的修改(看中数据的修改)
幻读则着重数据的插入与删除(强调集合的增减)

隔离性的四个隔离级别

1.读未提交 (read uncommitted)
是指一个事务能够读到别的事务中没有提交的更新数据;
最小限度的隔离,可能发生脏读,不可重复读,幻读。

2.读已提交 (read committed)
是指事务中的修改(数据)只有提交以后才能够被其他事务看到,这解决了脏读;
不可能发生脏读,可能发生不可重复读,幻读。

3.可重复读 (repeatable read)
它是mysql的默认界别,简单来说就是每次读取的结果都一样;
它保证了同一事务中先后执行的多次查询将返回同一结果,看到的每行记录的结果是一样的,不受其他事务的影响
保证了同一不可能发生脏读,不可重复读,可能发生幻读。

4.串行 (serializable)
不允许事务并发执行,强制事务串行执行(队列),在读取的每一行数据都加了锁,读写相互阻塞,效率低下
隔离性最高,是最安全的,但是效率最低,不会出现脏读,不可重复读,幻读
还可以通过锁来解决幻读
给这行数据加锁后 其他是要要并发操作这条数据 要等到当前的事务操作完并且提交了后才能继续操作这条数据。

MVVC(Multi-Version Concurrency Control) 多版本并发控制

MCCV是指Read committed 和 Repertable read 这两种隔离界别在执行普通SELECT时访问记录的版本链的过程。可以使用不同事务的读-写,写-读操作并发执行,从而提示系统性能。两者有很大不同
Read commintted 在每次进行普通SELECT操作前都会生成一个ReadView
Repeatable read 则是在第一次进行普通SELECT操作是生成READVIEW 而后的每一次查询都重复这个ReadView

MyISAM和InnoDB的区别

在mysql5.5以后默认数据库引擎急速InnoDB

MyISAM:

不支持事务,没次查询都是原子的
不支持外键,支持仅表级锁
是非聚集索引
保存表的具体行数
不一定有主键

InnoDB:

支持ACID事务
支持外键,支持表级锁,行级锁(默认),因此支持写并发
是聚集索引
不保存表的具体行数
必须有主键

Mysql有哪些锁

按粒度分:

表级锁:锁整张表,锁粒度最⼤,并发度低
行级锁:锁某行数据,锁粒度最小,并发度高
间隙锁:锁一个区间(可能是一行数据,也可能是区间 类似0.5-1.5 不单单只某一行数据)

其他:

乐观锁:相对于悲观锁而言,并不会真正的去锁某⾏记录,⽽是通过⼀个版本号来实现的
悲观锁:上⾯所的⾏锁、表锁等都是悲观锁

共享锁:也叫读锁,s锁,其他事务只能读,不能写
排他锁:也叫写锁,x锁,其他事务不能读写

Mysql中的慢查询优化!!!

1.避免全表查询,改为查询需要的字段,减小开销
2.检查是否走了索引,如果没有就优化sql利用索引
3.检查已有的索引是否为最优索引
4.数据过多,分库分表?
5.机器性能太低,网络太慢,升级机器,
6.检查满语句所查的字段是否是必须的,是否查出了多余的数据
7.减少表上的字段数量
8。减少跨表查询和连接查询

文档参考

事务的隔离性
事务的特性
还不了解 MyISAM 和 InnoDB 的区别?看这里就够了

以上是关于日常积累Mysql的主要内容,如果未能解决你的问题,请参考以下文章

SQL 性能调优日常积累

日常UVA题目英语积累

Linux命令日常积累

vim 日常积累

(转)Oracle 知识日常积累

日常积累Mysql