共计 1960 个字符,预计需要花费 5 分钟才能阅读完成。
常见相干问题
数据库事务(ACID)
原子性:事务是最小的执行单位,不容许宰割。事务的原子性确保动作要么全副实现,要么齐全不起作用;
一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的后果是雷同的;
隔离性: 并发拜访数据库时,一个用户的事务不被其余事务所烦扰,各并发事务之间数据库是独立的;
持久性: 一个事务被提交之后。它对数据库中数据的扭转是长久的,即便数据库产生故障也不应该对其有任何影响。
什么是脏读?幻读?不可反复读?
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,因为某些起因,前一个 RollBack 了操作,则后一个事务所读取的数据就会是不正确的。
不可反复读(Non-repeatable read): 在一个事务的两次查问之中数据不统一,这可能是两次查问过程两头插入了一个事务更新的原有的数据。
幻读 (Phantom Read): 在一个事务的两次查问中数据不统一,例如有一个事务查问了几列(Row) 数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查问中,就会发现有几列数据是它先前所没有的。
什么是事务的隔离级别?MySQL 的默认隔离级别是什么?
由低到高顺次为 Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别能够一一解决脏读、不可反复读、幻读这几类问题。
SQL 规范定义了四个隔离级别:
· READ-UNCOMMITTED(读取未提交): 最低的隔离级别,容许读取尚未提交的数据变更,可能会导致脏读、幻读或不可反复读。
· READ-COMMITTED(读取已提交): 容许读取并发事务曾经提交的数据,能够阻止脏读,然而幻读或不可反复读仍有可能产生。
· REPEATABLE-READ(可反复读): 对同一字段的屡次读取后果都是统一的,除非数据是被自身事务本人所批改,能够阻止脏读和不可反复读,但幻读仍有可能产生。
· SERIALIZABLE(可串行化): 最高的隔离级别,齐全遵从 ACID 的隔离级别。所有的事务顺次一一执行,这样事务之间就齐全不可能产生烦扰,也就是说,该级别能够避免脏读、不可反复读以及幻读。
Mysql 默认采纳的 REPEATABLE_READ 隔离级别 Oracle 默认采纳的 READ_COMMITTED 隔离级别
数据库为什么应用 B + 树而不是 B 树
· B 树只适宜随机检索,而 B + 树同时反对随机检索和程序检索;
· B+ 树空间利用率更高,可缩小 I / O 次数,磁盘读写代价更低。一般来说,索引自身也很大,不可能全副存储在内存中,因而索引往往以索引文件的模式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘 I / O 耗费。B+ 树的外部结点并没有指向关键字具体信息的指针,只是作为索引应用,其外部结点比 B 树小,盘块能包容的结点中关键字数量更多,一次性读入内存中能够查找的关键字也就越多,绝对的,IO 读写次数也就升高了。而 IO 读写次数是影响索引检索效率的最大因素;
· B+ 树的查问效率更加稳固。B 树搜寻有可能会在非叶子结点完结,越凑近根节点的记录查找时间越短,只有找到关键字即可确定记录的存在,其性能等价于在关键字选集内做一次二分查找。而在 B + 树中,程序检索比拟显著,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找门路长度雷同,导致每一个关键字的查问效率相当。
· B- 树在进步了磁盘 IO 性能的同时并没有解决元素遍历的效率低下的问题。B+ 树的叶子节点应用指针程序连贯在一起,只有遍历叶子节点就能够实现整棵树的遍历。而且在数据库中基于范畴的查问是十分频繁的,而 B 树不反对这样的操作。
· 增删文件(节点)时,效率更高。因为 B + 树的叶子节点蕴含所有关键字,并以有序的链表构造存储,这样可很好进步增删效率。
B+ 树在满足聚簇索引和笼罩索引的时候不须要回表查问数据,
在 B + 树的索引中,叶子节点可能存储了以后的 key 值,也可能存储了以后的 key 值以及整行的数据,这就是聚簇索引和非聚簇索引。在 InnoDB 中,只有主键索引是聚簇索引,如果没有主键,则筛选一个惟一键建设聚簇索引。如果没有惟一键,则隐式的生成一个键来建设聚簇索引。
当查问应用聚簇索引时,在对应的叶子节点,能够获取到整行数据,因而不必再次进行回表查问。
什么是聚簇索引?何时应用聚簇索引与非聚簇索引
· 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
· 非聚簇索引:将数据存储于索引离开构造,索引构造的叶子节点指向了数据的对应行,myisam 通过 key_buffer 把索引先缓存到内存中,当须要拜访数据时(通过索引拜访数据),在内存中间接搜寻索引,而后通过索引找到磁盘相应数据,这也就是为什么索引不在 key buffer 命中时,速度慢的起因