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. lsm和lkm模块

    使用LSM Hook框架进行内核安全审计.元数据捕获,安全人员只需要按照既定的调用规范编写LKM模块,并加载进Linux内核,而不需要对system call lookup表进行任何修改 https: ...

  2. C++:查找字符串字串并替换

    string a;/////指定串,可根据要求替换 string b;////要查找的串,可根据要求替换 string c; cin>>a>>b>>c; int p ...

  3. php面向对象深入理解(二)

    一个简单的小程序:   配置 config.ini <?php //项目的根目录 define("ROOT","F:/文件夹的名字/oop/"); //数 ...

  4. Nmap扫描与Tcpdump抓包分析

    扫描与抓包分析 3.1 问题 本案例要求熟悉Linux主机环境下的常用安全工具,完成以下任务操作: 使用NMAP扫描来获取指定主机/网段的相关信息 使用EtterCAP截获明文通信的密码.检测非加密通 ...

  5. NX二次开发-UFUN读取表格注释内容UF_TABNOT_ask_cell_text

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_tabnot.h> #include < ...

  6. NX二次开发-UFUN将建模绝对空间中的点映射到工程图坐标UF_VIEW_map_model_to_drawing

    #include <uf.h> #include <uf_ui.h> #include <uf_draw.h> #include <uf_view.h> ...

  7. vue中利用scss实现整体换肤和字体大小设置

    一.前言 利用Sass预处理实现换肤和字体大小调整. 思路及达到的效果:字体大小的适配使用window.devicePixelRatio的值和需要调整的差量进行控制.页面初始化是的字体适配可以根据de ...

  8. XStream入门应用程序

    在进入XStream库的细节之前,让我们来看看应用程序操作.在这个例子中,我们创建Student和Address类.还将创建一个Student对象,然后将其序列化到一个XML字符串.然后反序列化的同一 ...

  9. Hadoop节点集群挂了,Hbase数据源损坏怎么办

    今天集群节点一下子挂了5台,hbase的数据块也损坏. hadoop日志 .0.15:36642 dest: /ip:50010 2014-08-26 15:01:14,918 WARN org.ap ...

  10. NEO4J中文分词全文索引自动更新解决方案

    NEO4J中文分词全文索引自动更新解决方案 一.样例数据 二.英文与中文全文索引差别 1.创建NEO4J默认索引 2.删除索引 3.创建支持中文分词的索引 三.APOC自带英文全文索引过程(可自动更新 ...