mysql怎么查询树高度 mysql索引树高度

Mysql InnoDB b+树的高度

为什么Mysql考虑使用B+树,而不是B树,其实我们可以先了解下B树和B+树的特点来看下。

成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的丰满网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

※ 树的每个结点都会存储数据

※ 单次查询不一定要遍历到树的根部,平均查询时间会比较快

※ 非叶子节点不存储数据,只存储(冗余)索引,索引包含主键和指针

※ 叶子节点才真正存储数据

※ 每个叶子节点互相链表相连,保证了范围查询的时效性(页之间用双向链表连接,数据间用单项链表链接)

InnoDB最小存储单位是页,叶子节点和非叶子节点最小单位都是页,页大小Mysql 默认设定16384字节,约为16KB。

我们假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,这样一共14字节

我们一个页中能存放多少这样的索引元素,其实就代表有多少指针,即16384/14=1170;

高度为2的B+树能存放1170×16=18720

高度为3的B+树能存放1170×1170×16 = 21902400

InnoDB中B+树高度一般为1-3层,它就能满足千万级的数据存储。

在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找到数据。

MYSQL 那点破事!索引、SQL调优、事务、B+树、分表 ....

大家好,我是Tom哥~

为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于mysql数据库,面试官一般喜欢问哪些问题

接下来,我们逐条来看看每个问题及答案

MyISAM 和 InnoDB 的区别?

答案:InnoDB 支持 事务、外键、聚集索引,通过MVCC来支持高并发,索引和数据存储在一起。InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数。

InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁,并发能力低。MySQL 将默认存储引擎是 InnoDB

mysql 锁有哪些类型?

答案:mysql锁分为共享锁( S lock ) 、排他锁 ( X lock ),也叫做读锁和写锁。根据粒度,可以分为表锁、页锁、行锁。

什么是间隙锁?

答案:间隙锁是可重复读级别下才会有的锁,mysql会帮我们生成了若干 左开右闭 的区间,结合MVCC和间隙锁可以解决幻读问题。

如何避免死锁?

答案:死锁的四个必要条件:1、互斥 2、请求与保持 3、环路等待 4、不可剥夺。

数据库的隔离级别?

答案:读未提交、读已提交、可重复读(mysql的默认级别,每次读取结果都一样,但是有可能产生幻读)、串行化。

Mysql有哪些类型的索引?

答案:

什么是覆盖索引和回表?

答案:

1、覆盖索引,指的是在一次查询中,一个索引包含所有需要查询的字段的值,可能是返回值或where条件

假如我们创建了一个(money,buyer_id)的联合索引,索引的叶子节点包含了 buyer_id 的信息,则不会再 回表 查询。

2、回表,指查询时一些字段值拿不到,需要到主键索引B+树再查一次。

Mysql的最左前缀原则?

答案:即最左优先,在检索数据时从联合索引的最左边开始匹配,直到遇到范围查询(如: 、 、between、like等)

例子:where a = 1 and b = 2 and c 3 and d = 4 ,如果建立(a,b,c,d)组合索引,d是用不到索引的;如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

线上SQL的调优经验?

答案:

官方为什么建议采用自增id 作为主键?

答案:自增id是连续的,插入过程也是顺序的,总是插入在最后,减少了页分裂,有效减少数据的移动。所以尽量不要使用字符串(如:UUID)作为主键。

索引为什么采用B+树,而不用B-树,红黑树?

答案:提升查询速度,首先要减少磁盘IO次数,也就是要降低树的高度。

事务的特性有哪些?

答案:ACID。

如何实现分布式事务?

答案:

日常工作中,MySQL 如何做优化?

答案:

mysql 主从同步具体过程?

答案:

什么是主从延迟?

答案:指一个写入SQL操作在主库执行完后,将数据完整同步到从库会有一个时间差,称之为主从延迟。计算公式:

注意:不同服务器要保持时钟一致

主从延迟排查方法?

答案:通过 show slave status 命令输出的 Seconds_Behind_Master 参数的值来判断

主从延迟要怎么解决?

答案:

如果数据量太大怎么办?

答案:mysql表的数据量一般控制在千万级别,如果再大的话,就要考虑分库分表。除了分表外,列举了面对海量数据业务的一些常见优化手段

分表后ID如何保证全局唯一呢?

答案:分库分表后,多张表共用一套全局id,原来单表主键自增方式满足不了要求。我们需要重新设计一套id生成器。特点:全局唯一、高性能、高可用、方便接入。

分表后可能遇到的哪些问题?

答案:分表后,与单表的最大区别是有分表键 sharding_key ,用来路由具体的物理表,以电商为例,有买家和卖家两个维度,以 buyer_id 路由,无法满足卖家的需求,反之同样道理。如何解决?

MySQL_索引树

查看树插入删除图解:

时间复杂度:O(N)

时间复杂度:O(logn)

如果数据插入是递增或者递减顺序的话,会使树成为链式结构。 时间复杂度:O(N)

为了保证平衡,在插入或者删除的时候必须要旋转,通过插入或者删除性能的损失来弥补查询性能的提升。

但如果写请求和读请求一样多的时候怎么办?

随着数据的插入,树的深度会变深,树的深度越深,意味着 IO 次数越多。影响数据读取的效率。

MySQL 的页大小是16k。假设只有data 占用空间且占用 1k 一个磁盘块可以放置16条记录,三层就是 4096条记录。肯定小于 4096.

如果想要放入更多的数据的化,得加层。加层 IO 量肯定上来了。

data 太占内存,导致存储数据太少。

MySQL加载索引是以磁盘块(页)为单位的,页(Page)是 Innodb 存储引擎用于管理数据的最小磁盘单位。默认的页大小为 16KB。

假设只有 p1+key 值 占用空间且占用 10字节, 一个磁盘块可以放置1600条记录,三层就是 40960000条记录。

在B+树 上有两个头节点,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有的叶子节点(即数据节点)之间是一种链式环结构,因此可以对 B+树 进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

让当前key值尽可能的少占用存储空间,才能保证存储更多的值。降低树的高度,减少IO。

保证key的长度越小越好。

mysql 查询树形接口sql

mysql啊,这个还真不知道可不可以。不过oracle可以,递归查询上上级,或者查询到下下级都可以。代码参考:

查询出员工号为7788的所有上级。

select * from scott.emp start with empno=7788 connect by prior mgr= empno;

mysql里面如果sql不能实现,那就用程序里面的list啊,查询一个添加一个,循环(while)直到它的上级id为空为止。

事实上更建议用程序的方法,程序写代码更灵活,而sql不必写的太复杂。

MySQL怎么查询树形结构的表的数据

一般比较普遍的就是四种方法:(具体见 SQL Anti-patterns这本书)

Adjacency List:每一条记录存parent_id

Path Enumerations:每一条记录存整个tree path经过的node枚举

Nested Sets:每一条记录存 nleft 和 nright

Closure Table:维护一个表,所有的tree path作为记录进行保存。


当前名称:mysql怎么查询树高度 mysql索引树高度
标题来源:http://azwzsj.com/article/hpssph.html