索引与算法
二分查找法
将记录按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分。通过一次比较,将查找区间缩小一半。
平衡二叉树
二叉查找树:左子树的键值总是小于根的键值,右子树的键值总是大于根的键值。
平衡二叉树:首先符合二叉树的定义,其次必须满足任何节点的左右两个子树的高度最大差为1。平衡二叉树对于查询速度的确很快,但是维护一颗平衡二叉树的代价非常大,通过一次或多次左旋和右旋来得到插入或更新后树的平衡性。
B+树
B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。
B+树索引
B+树索引本质是B+树在数据库中的实现,在数据库中,B+树的高度一般都在2~3层,也就是对于查找某一键值的行记录,最多只需要2到3次IO。 数据库中的B+树索引可以分为聚集索引和辅助聚集索引,其内部都是B+树,即高度平衡的,叶子节点存放所有的数据。聚集索引和非聚集索引不同的是,叶节点存放的是否是一整行的信息。
聚集索引
聚集索引就是按照每张表的主键构造一颗B+树,并且叶节点中存放着整张表的行记录数据,因此也让聚集索引的叶节点成为数据页。
聚集索引的存储并不在物理上的连续,是逻辑上连续。页通过双向链表链接,页按照主键的顺序排列;每个页中的记录也是通过双向链表进行维护,物理存储上同样可以不按照主键存储。
聚集索引的另一个好处是,它对于主键的排序查找和范围查找速度非常快。叶节点数据就是我们要查询的数据。
辅助索引
辅助索引也称非聚集索引,叶级别不包含行的全部数据。叶节点除了包含键值以外,每个叶级别中的索引行中还包含了一个书签,该书签用来告诉InnoDB存储引擎,哪里可以找到与索引相对应的行数据。因为InnoDB存储引擎表是索引组织表,因此InnoDB存储引擎的辅助索引的书签就是相应行数据的聚集索引键。
辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引。当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获取指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录。
锁
InnoDB存储引擎实现了如下两种标准的行级锁:
- 共享锁(S Lock),允许事务读一行数据。
- 排他锁(X Lock),允许事务删除或者更新一行数据。 当一个事务已经获得了行r的共享锁,那么另外的事务可以立即获得行r的共享锁,因为读取并没有改变行r的数据,我们称这种情况为锁兼容。如果有事务想获得行r的排他锁,则它必须等待事务释放行r上的共享锁,这种情况称为锁不兼容。
InnoDB存储引擎支持两种意向锁:
- 意向共享锁(IS Lock),事务想要获得一个表中某几行的共享锁。
- 意向排他锁(IX Lock),事务想要获得一个表中某几行的排他锁。
事务
InnoDB存储引擎中的事务完全符合ACID的特性:
- 原子性(atomicity):整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作执行都成功,才算整个事务成功。如果事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。
- 一致性(consistency):事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破环。
- 隔离性(isolation):一个事务的影响在该事务提交前对其他事务都不可见,这通过锁来实现。
- 持久性(durability):事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。
事务的隔离级别:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ(InnoDB存储引擎默认隔离级别)
- SERIALIZABLE
参考:MySQL技术内幕InnoDB存储引擎