MySQL是基于磁盘的数据库,磁盘的性能瓶颈在于磁盘IO,我们知道磁盘是按照页进行存取的,每一页是固定大小,比如16KB,对于均衡二叉树和红黑树等,当数据量大的时候,它们的树通常是很高的,每次查询都只能取一个节点放入内存中查找,如许就会增加IO次数,查询效率低下。因此B树一族的优化思路就是不再限制一个节点就只能有 2 个子节点,而是允许 M 个子节点 (M>2),从而降低树的高度。
B 树的每一个节点最多可以包罗 M 个子节点,M 称为 B 树的阶,以是 B 树就是一个多叉树。每一次都取一批节点放入内存中查找,极大降低了磁盘IO。
相对于B树,B+树做了两方面优化,一方面是非叶子节点只存放索引,另一方面是叶子节点间使用双向链表维护。对于非叶子节点的优化,实在还是针对减少磁盘IO的进一步优化。磁盘IO每一页的大小是固定的,我们希望一页存取的元素个数越多,那么每个元素的大小就得越小,因此B+树的优化就是非叶子节点不再存放完整记录,如许节点的大小就极大减小了,磁盘IO次数也就减少了,进一步提升了查询效率。针对于叶子节点用双向链表维护,这种设计对范围查找非常有资助。而 B 树没有将全部叶子节点用链表串联起来的结构,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。
5.事件的隔离级别分别怎么实现的?
InnoDB中给指定的行添加锁:如 select * from student where id > 10 for update 。
是通过给索引上的索引项加锁来实现的,如果没有索引则会类似表锁(比如通过隐藏的聚簇索引) 。
行锁的劣势是开销大、加锁慢、会出现死锁;优势是锁的粒度小,发生锁冲突的概率低;处理并发的本领强。
页级锁
页级锁的颗粒度介于行级锁与表级锁之间。
主要应用于BDB存储引擎(现在使用相对较少)。
三、按锁级别分别
共享锁(share lock,即 S 锁)
又称读锁,允许一个事件去读取一行,阻止其他事件获得相同数据集的排它锁。若事件 t 对数据对象 a 加上 S 锁,则事件 t 可以读 a,但不能修改 a,其他事件只能对再对 a 加 S 锁,而不能加 X 锁 ,直到 t 释放 a 上的锁。这保证了其他事件可以读 a,但在释放 a 上的 S 锁之前不能对 a 做任何修改。
排它锁 / 独占锁(exclusive lock,即 X 锁)
又称写锁,允许获取排它锁的事物更新数据,阻止其他事件取得相同的数据集共享读锁和排它写锁。若事件 t 对数据对象 a 加上 X 锁,事物 t 可以读 a 也可以修改 a,其他事件不能再对 a 加任何锁,直到 t 释放 a 上的锁。
意向锁
意向共享锁(IS):表示事件准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的 IS 锁;
意向排他锁(IX):类似上面,表示事件准备给数据行加入排他锁,说明事件在一个数据行加排他锁前必须先取得该表的 IX 锁。意向锁是 InnoDB 自动加的,不必要用户干预。