数据库
1.事务
1.事务四大特性
原子性,要么执行,要么不执行
隔离性,所有操作全部执行完以前其它会话不能看到过程
一致性,事务前后,数据总额一致
持久性,一旦事务提交,对数据的改变就是永久的
2.事务并发
事务的隔离级别?
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
串行化 | × | × | × |
3.脏读、不可重复读、幻读?
脏读 | 不可重复读 | 幻读 |
---|---|---|
A事务执行过程中,B事务读取了A事务的修改。但是由于某些原因,A事务可能没有完成提交(读未提交),发生RollBack了操作,则B事务所读取的数据就会是不正确的 | B事务读取了两次数据,在这两次的读取过程中A事务修改了数据(读已提交),B事务的这两次读取出来的数据不一样。B事务这种读取的结果,即为不可重复读 | 事务读取了两次数据,在这两次的读取过程中A事务添加了数据,B事务的这两次读取出来的数据不一样 |
2.锁
数据库系统 | 程序员角度 | 级别角度 |
---|---|---|
X/排他/互斥锁、S/共享/读锁、U/更新锁 | 一种是悲观锁,一种乐观锁 | 行(级)锁,表(级)锁,间隙锁 |
X/排他/互斥锁 | S/读/共享锁 | 更新锁 |
---|---|---|
如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了 | 用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。 | 1. 首先获得一个共享锁,读取数据,2. 然后将共享锁升级为排他锁,再执行修改操作。 |
读写锁
是一种 读共享,写独占的锁(共享锁+互斥锁)。可理解为一本小说有多个作家和读者,只能一个作家在写,允许一个作家和多个读者使用。
当读写锁被加了写锁时,其他线程对该锁加读锁或者写锁都会阻塞。
当读写锁被加了读锁时,其他线程对该锁加写锁会阻塞,加读锁会成功。
悲观锁
顾名思义,很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人拿这个数据就会block(阻塞),直到它拿走锁。利用事务的机制,适用临界区有IO操作,代码复杂,竞争激烈的情况。
乐观锁
没有用到锁,修改时认为自己可以拿到资源,修改资源的状态。是使用CAS来进行同步,要修改资源时进行一个compare再swap的操作。是应用层实现的机制,适用于并发写入少,大多是读操作的情况。
行(级)锁
某一行数据有多个修改的,后修改的需要等先修改的提交后再执行。
表(级)锁
一个原因:索引失效(例如,条件语句使用or连接),由行级锁升级为表锁。
sql语句实现
MyISAM和InnoDB引擎的区别
MyISAM | InnoDB |
---|---|
data存的是数据地址,索引放在XX.MYI文件中,数据放在XX.MYD文件中,所以也叫非聚集索引 | data存的是数据本身,数据和索引存在一个XX.IDB文件中,所以也叫聚集索引 |
非事务安全 | 事务安全 |
表级,全文类型索引 | 行级锁 ,不支持全文索引 |
效率高 | 效率低 |
select操作 | ACID事务支持 |
b树与B+树的区别
B树 | B+树 |
---|---|
每个节点都存储key和data ,叶子节点指针为null | 中间节点只存索引 ,可以存储更多的数据,更加的矮胖io次数更少 查询性能稳定,范围查询等值简单,等值 |
3.索引
索引是帮助MySQL高效获取数据的数据结构,
能加快数据库的查询速度。
1.索引的优势和劣势
优势:
可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
劣势:
索引会占据磁盘空间
索引虽然会提高查询效率,但是会降低更新表的效率。
2.索引分类
普通索引:
MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。
唯一索引:
索引列中的值必须是唯一的,但是允许为空值。
全文索引:
只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。
空间索引:
MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。
前缀索引:
在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。
mysql所有知识点:一文搞懂mysql索引