滴滴:能说说Mysql索引底层B+树结构与算法吗?
MySQL的索引是基于B+树的数据结构,而B+树是一种自平衡的树,能够保持数据的有序性,非常适合用于数据库和文件系统的索引。
B+树的特点:
所有值都出现在叶子节点上,并且叶子节点之间有顺序的链表关系,便于顺序访问。
所有的叶子节点都位于同一层,并且指向数据的指针都是空的。
非叶子节点不存储数据,只存储键值和子节点指针。
所有的叶子节点通过指针相互连接,形成一个链表结构,便于顺序访问。
B+树的插入操作:
如果插入的键值在叶子节点中不存在,直接插入到叶子节点中。
如果插入的键值在非叶子节点中不存在,需要按照键值的大小找到相应的位置,然后向下查找直到找到空位,将键值插入到空位中。
如果插入后导致树的深度过大,需要进行分裂操作,将一部分数据移动到新的节点中。
B+树的删除操作:
如果删除的键值在叶子节点中存在,直接从叶子节点中删除。
如果删除的键值在非叶子节点中存在,需要按照键值的大小找到相应的位置,然后向下查找直到找到要删除的键值,将其删除。
如果删除后导致节点的数据量过少,需要进行合并操作,将相邻的节点合并到一起。
B+树的优势:
B+树能够保持数据的有序性,能够快速地查找、插入和删除操作。
B+树的非叶子节点不存储数据,只存储键值和子节点指针,使得数据的空间利用率更高。
B+树的叶子节点之间有顺序的链表关系,便于顺序访问。
滴滴:聚集索引与覆盖索引与索引下推到底是什么?
聚集索引(Clustered Index)是一种特殊的索引,它决定了表的物理存储顺序。在聚集索引中,索引的叶子节点包含了整个行的数据。每张表只能有一个聚集索引。
覆盖索引(Covering Index)是指索引包含了查询所需的所有列,无需通过索引进行二次查找。当查询只需要索引包含的列时,可以直接从索引中获取结果,而无需访问表的数据行。覆盖索引可以提高查询性能,减少磁盘I/O操作。
索引下推(Index Condition Pushdown)是MySQL 5.6版本引入的一项优化技术。它利用覆盖索引的特性,在执行查询时将非索引列的条件下推到存储引擎层进行过滤,减少了不必要的数据读取和处理。索引下推可以减少磁盘I/O以及网络传输的开销,提高查询性能。
综合起来说,聚集索引决定了表的物理存储顺序,覆盖索引包含了查询所需的所有列并避免了二次查找,而索引下推则是在执行查询时将非索引列的条件下推到存储引擎层进行过滤。这些技术都是为了优化查询性能,减少不必要的数据访问和处理操作。
阿里:能说说Mysql并发支撑底层Buffer Pool机制吗?
拼多多:能说下Mysql事务底层实现原理吗?
唯品会:MVCC机制是如何保证事务的隔离性的?
京东:超高并发下使用事务时如何避免死锁?
京东:对线上千万级大表加字段时,性能极慢问题如何处理