mysql索引原理深度解析

mysql索引原理深度解析

一、总结

一句话总结:

mysql索引是b+树,因为b+树在范围查找、节点查找等方面优化 hash索引,完全平衡二叉树,b树等

 

1、数据库中最常见的慢查询优化方式是什么?

加索引

 

2、为什么加索引能优化慢查询?

因为索引其实就是一种优化查询的数据结构,比如mysql中的索引是用b+树实现的,而b+树就是一种数据结构

 

3、你知道哪些数据结构可以提高查询速度?

哈希表,完全平衡二叉树,b树,b+树等等

 

4、解决hash冲突的两个方法?

链表法:冲突的放到一个链表上
再散列法:再次已经一次hash找位置

 

5、索引为什么能够优化查询?

因为索引用的b+树,相比于一行一行的去找,肯定快很多

 

6、为什么mysql索引优化用的是b+树,而不是hash索引?

hash索引查找速度非常快,但是不支持范围查找,比如查找大于 某个数的,比如不支持查找大于 马超的

 

7、为什么mysql索引优化用的是b+树,而不是完全平衡二叉树?

完全平衡二叉树支持找范围的,比如大于某个元素的:自己右孩子+父亲的右孩子
b树和b+树高度低,找元素快:b树和b+树因为一个节点可以存多个元素,所以树的高度比平衡二叉树的高度要低,所以找元素要快(所以更少的磁盘io操作)

 

8、为什么mysql索引优化用的是b+树,而不是b树?

用空间换了时间,b+树非叶子节点冗余进了叶子节点,b+树叶子节点之间有指针,这样找大于什么或者小于什么特别快

 

9、完全平衡二叉树和b树b+树的区别是什么?

b树b+树一个节点里面可以存多个元素

 

10、b树和b+树的区别和联系是什么?

b+树节点是有冗余的,冗余的都是叶子节点,非叶子节点的数据都冗余在了叶子节点里面
b+树的叶子节点之间用了指针联系起来
b树和b+树节点里面都是有顺序的,节点里面都是可以存多个元素的
b树和b+树的高度是一样的,只是b+树因为叶子节点要冗余非叶子节点,所以存的元素多一点而已

 

11、mysql中用b+树的好处是什么?

找范围的更快:比如我要做所有大于周瑜的,因为叶子节点之间有指针,并且非叶子节点的数据冗余在了叶子节点上,所以只用叶子节点一条链,就可以找到,非常快
树高度低,找元素快:b树和b+树因为一个节点可以存多个元素,所以树的高度比平衡二叉树的高度要低,所以找元素要快(所以更少的磁盘io操作)

 

12、为什么考虑数据库索引的结构的时候要考虑磁盘io的效率?

因为索引肯定是存在文件里面的,文件是存在磁盘里面的,所以读索引肯定就涉及到了 磁盘io操作

 

13、磁盘io对数据库索引查询效率影响较大,给了我们什么启示?

可以将数据从磁盘中读入到内存中,避免频繁的磁盘io访问

 

14、b树和b+树一个节点中可以存多个元素,那么一个节点中存多少个元素好(节点的大小是多少好)?

页的倍数:mysql中为16KB,是操作系统页的4倍:这样可以保证不浪费:因为操作系统一般都是以页为最小单位取数据的
节点的大小如果 小于 操作系统页的大小,会造成浪费
节点的大小如果 大于 操作系统页的大小,也会造成浪费

 

15、mysql里面设置的一个节点的大小是多少?

去mysql配置文件中去看,可以发现 page_size(Innodb_page_size)的值是16384,也就是16kb,是操作系统页的4倍,这是一个经验值,操作系统一页的大小一般是4kb

 

16、操作系统的局部性原理是什么?

比如你现在要去0x22这里取20B的数据,操作系统直接在这周围取1kb的,你下次如果是取这周围的数据(很大可能),我就可以直接在内存中取了,不用访问数据库了

 

17、mysql使用b+树的时候,为什么只在叶子节点存data,而不在非叶子节点也存上data?

因为节点的大小固定的,比如16kb,那么每个节点里面存的元素的大小要越小越好,所以只在叶子节点处存data

 

18、innodb的数据和索引存在一起的好处是什么?

找索引的时候直接可以找到数据,省了一次磁盘io,不必根据索引再去磁盘io里面找数据

 

19、innodb表中你没有写主键,为什么也可以用?

因为innodb的索引和数据存在一起,所以你就算没写主键,没有索引,innodb也会主动给你建一个的

 

20、mysql中b+树的节点的大小是固定的16kb,为什么mysql的设计人员会选择这个经验值?

二层b+树:找2次:存18724条数据
三层b+树:找3次:存21907748:2200W条数据

 

21、mysql中高度为2的b+树,可以存多少条数据?

叶子节点个数*16条=1170*16=18724条数据
一个叶子节点存16条数据:假设1条数据=1kb,叶子节点只存了数据,一个叶子节点里面可以存 16kb/1kb=16条数据
非叶子节点存1170个叶子节点:非叶子节点存了索引指针对:索引(bigint:8b)+指针(6b),所以可以存的对数为 16KB/14b=1170对

 

22、mysql中高度为3的b+树,可以存多少条数据?

叶子节点个数*叶子节点个数*16条=1170*1170*16=21907748:2200W条数据
一个叶子节点存16条数据:假设1条数据=1kb,叶子节点只存了数据,一个叶子节点里面可以存 16kb/1kb=16条数据
非叶子节点存1170个叶子节点:非叶子节点存了索引指针对:索引(bigint:8b)+指针(6b),所以可以存的对数为 16KB/14b=1170对

 

23、如果有索引,mysql的2W条数据和2000W条数据的性能如何?

差不多,都是高度为3的b+树

 

24、mysql中的联合索引怎么存?

将联合索引字段对应的数据连接起来合成一个整体,比如10110_teacher_30(字符串),然后以单索引的b+树那么存

 

25、判断mysql中的索引用到没用到的实质是什么?

如果索引表限定了查询范围,就是用到了索引,比如要找到位1_23_aa,我发现索引b+树的根节点为3-23-bb,那我就只用去左子树里面去找了,这就是用到了索引

 

26、如何判断联合索引是否被用到了?

判断用到了联合索引字段的前面的字段:因为联合索引是将联合索引字段对应的数据连接起来合成一个整体,比如10110_teacher_30(字符串),然后以单索引的b+树那么存,而字符串比较又是从字符串的前头开始比较起的,所以如果判断用到了联合索引字段的前面的字段,就用到了索引

 

27、mysql如果我找数据有两个索引,那么我用哪个?

mysql的查询优化器会预估判断你哪个索引花费小,就用哪个

 

28、mysql中explain select * from user where name is null用到索引了么?

用到了索引,mysql会把null存到索引的b+树里面去,所以用到了索引

 

29、数据结构可视化网站?

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

 

30、mysql进阶学习怎么学?

索引的原理与 使用
EXPLAIN 和 查询优化器的使用
MYSQL 锁机制
MYSQL 事务机制

 

 

 

 

二、内容在总结中

b+树

b树

 

mysql中b+树

 

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/10952481.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值