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+树

 

mysql索引原理深度解析的更多相关文章

  1. mysql索引原理及用法

    MySQL索引原理及慢查询优化 Mysql explain用法和性能分析 MySQL 索引优化全攻略 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提 ...

  2. [转] MySQL索引原理

    MySQL索引原理 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉 ...

  3. Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...

  4. MySQL 索引原理以及慢查询优化

    本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree ...

  5. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

  6. (转)MySQL索引原理及慢查询优化

    转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...

  7. MySQL索引原理及慢查询优化 转载

    原文地址: http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...

  8. MySQL索引原理及慢查询优化(转)

    add by zhj:这是美团点评技术团队的一篇文章,讲的挺不错的. 原文:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰 ...

  9. 【转载】MySQL索引原理及慢查询优化

    原文链接:美团点评技术团队:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型 ...

随机推荐

  1. 关于windows一些常用的快捷键使用说明

    犹由于经常使用linux和windows,所以有时候就会觉得windows一点需要点击好多下才能够完成的设定非常的麻烦,这里总结一些常用到的快捷键功能,会随着本小白的工作经验而添加. 1.ctrl+a ...

  2. Tools: geos 使用指南

    1. 下载geos 2. 进入VS开发人员命令提示3.依次执行如下命令 >VCVARS32.BAT>cd D:\DevTool\geos-3.7.0>atuogen.bat>n ...

  3. 传输文件到docker容器

    传输文件到docker容器 首先需要知道docker容器的container_id,可以使用docker ps命令来查看你要操作的docker容器的container_id Docker容器向宿主机传 ...

  4. J2SE基础-环境配置

    学习资料:毕向东视频 1.为何配置Path? 使用javac编译文件时,先找path里设置的java路径. 如果不配置Path,在命令提示行中,则只能进入bin目录后,才能执行javac,jar等命令 ...

  5. 2019.7.3模拟 七星连珠(行列式+随机+k进制FWT)

    题目大意: 给一个\(n*n\)的矩阵,对于所有排列p,记录\(a[i][p[i]]\)的k进制下不进位加法的结果,问所有被记录过的数. \(n<=50,p=2.3,0<=a[i][j]& ...

  6. bzoj1057: [ZJOI2007]棋盘制作 [dp][单调栈]

    Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应 ...

  7. HTML 技巧

    超过指定宽度以".."显示 width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;

  8. 互联网公司java面试题(一)

    1.JDK和JRE区别? JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库.通过JDK开发人员将源码文件(java文件)编译成字节码文件(class文 件 ...

  9. WinDbg解决BHO不加载

    昨天zhengwei同学说他机器上的一个BHO不能正常加载,我把BHO的代码拿过来,在我的两台机器上都验证了一下,一台是Win7+IE8的环境,一台是XP+IE7的环境,都能正常加载.zhengwei ...

  10. Git 远程仓库分支管理

    目录 目录 速查表 关联远程代码仓库 克隆远程仓库 分支管理 创建分支 切换分支 合并分支 删除分支 解决冲突 速查表 指令 作用 git branch 查看分支 git branch newBran ...