哈希索引
哈希索引查找快,但是无序,不能做范围查找
同时存在哈希碰撞的问题,如果值都在某一个哈希,也会导致检索很慢
平衡二叉树 Balance
树越高查找速度越慢
对范围查找也很慢,需要解决回旋查找的问题
平衡二叉树,会动态平衡树结构,当一侧的层级高度高于另外一侧大于1时,则自动去平衡左右关系,来达到平衡。当左右高度相差大时,查询速度时快时慢,不稳定,当左右平衡后,查询速度就会比较稳定。如下图所示:
B树
B树的高度比平衡二叉树高度变矮,一个节点可以存多个数据。数据大小由磁盘最小单位扇区决定。
每个硬盘都会有多个盘片,每个盘片上分割如图,呈同心圆环状,圆圈就是磁道,每个磁道被等分为以512个字节为单位的若干个弧段,这些弧段便是磁盘的扇区,每个扇区可以存放512个字节的信息,扇区就是磁盘的最小单位了。所以,如果要达到最理想查询效果,应该是想办法让每个节点中存储的数据的数据量大小接近512个字节。
B+树
B+树解决了回旋查找的问题
所有叶子节点组成一个链表
联合索引(多键值索引)
最左匹配原则,一定要带上前面的索引
MyIsam和InnoDB引擎区别
外键方面
innodb支持外键,myisam不支持外键,对一个包含外键的innodb表转为myisam会失败
索引层面
myisam是非聚簇索引
非聚簇索引:将数据和索引不放在一起
innodb是聚簇索引,
聚簇索引:将数据和索引放在一起
myisam支持全文索引
inbodb不支持全文索引,可通过sphinx插件支持全文索引,并且效果更好
锁粒度方面
innodb最小支持行锁
myisam最小支持表锁,一个更新语句会导致全表被锁
硬盘存储结构
myisam三个文件
.frm 存表结构定义
.MYD 存数据
.MYI 存索引
inbodb两个文件
.frm 存表结构定义
.Idb 保存数据和索引
辅助索引->聚簇索引
事务的四大特性ACID :
原子性 undo log
持久性 redo log
一致性
隔离性 加锁
怎么用理解ACID,理解一致性?
原子性:
强调对数据的状态的描述,要么成功要么失败。不存在部分成功的状态。
一致性:
强调对数据的可见性描述,对于数据的中间态是不可见的。
隔离性:
如果完全按照一致性的定义的话,就只能是通过加排他锁来走完全序列化才能达到强一致性也就是serialization这种隔离机制,引入隔离机制就是为了提高并发,提高可用性,因为完全串行化访问效率太低,现实中很少用到,做工程是以实用为主,所以引入不同等级隔离机制,来有针对性的面向各类场景对一致性达到不同等级破坏,以提高并发提高可用。
持久性:
持久性比较好理解,就是对于存储的各类信息一旦提交,那么无论多久都将不变,这也是存储的意义。
MVCC
多版本并发控制
什么是当前读和快照读?
数据库四中隔离级别:
读未提交
读已提交 (存在脏读和幻读)
可重复读(默认) 可避免脏读(update)不能避免幻读(insert or update)
串行化、序列化
undo log和版本涟
readview
readview决策应该访问版本链中那条数据
read view中四变量。活跃事务(活跃事务就是没提交的事务)集合,当前事务id,集合中的最小值,集合中最大值的下个值。都是select查出的最新数据事务id跟四个变量进行比较判断的。判断方法可以逆推,就是凡是小于最小值,不包含活跃事务里面的,刚好等于当前事务的id,都可以查询最新值。其他任何情况都要一直递归查询undo日志,直到符合这三个条件为止。
读已提交:MVCC实现是在每次select时生成readview
可重复读:MVCC实现是以事务为单位的,此时readview是事务级的
innodb默认开启间隙锁,间隙锁解决了幻读问题,锁一段范围