mysql索引原理深度解析

时间:2022-12-28 13:39:11

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

mysql索引原理深度解析

b树

mysql索引原理深度解析

mysql中b+树

mysql索引原理深度解析

 

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. .apache2 设置多个虚拟域名

    <VirtualHost 127.0.0.2:80> ServerName www.xylilun.cn DocumentRoot E:/www/ylll <Directory E: ...

  2. leetcode 题解&colon; Length of Last Word

    leetcode: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', re ...

  3. boost&colon;&colon;string or boost&colon;&colon;regex

    有时候写代码时会遇到下面问题 如果有一个文本文件,其包括内容类似于C语言,当中有一行例如以下格式的语句: layout (local_size_x = a,local_size_y = b, loca ...

  4. ios逆向过程中lldb调试技巧

    在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f  看看各个模块在内存中的基址 2.register read r0  读取寄存器r0的 ...

  5. 使用RMS API 自定义Office(Word、Excel、PPT)加密策略

    什么是RMS: Microsoft Windows Rights Management 服务 (RMS),是一种与应用程序协作来保护数字内容(不论其何去何从)的安全技术,专为那些需要保护敏感的 Web ...

  6. MongoDB 数据库命令

    数据库命令 连接成功后,默认使用test数据库 查看当前数据库名称 db 查看所有数据库名称,列出所有在物理上存在的数据库 show dbs 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建 ...

  7. 深入C&plus;&plus;的new

    new”是C++的一个关键字,同时也是操作符.关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结. new的过程 当我们使用关键字new在堆上动态 ...

  8. POJ 2484 A Funny Game 博弈论 对称博弈

    http://poj.org/problem?id=2484 1和2时Alice必胜,3时Bob必胜,其他情况下Bob只需要在Alice取过之后取一次将剩下的硬币链平均分为两份,然后Alice怎么取B ...

  9. Go语言是如何处理栈的

    转自:http://tonybai.com/2014/11/05/how-stacks-are-handled-in-go/ Go 1.4Beta1刚刚发布,在Go 1.4Beta1中,Go语言的st ...

  10. jQuery -&amp&semi;gt&semi; 获取后代元素的三种方法

    假设我们有内容例如以下的html文件,那么怎样选取包括在<p>元素内的<i>元素呢? 邪馬台国の謎と弥生時代 紀元前1000年ごろ.水稲工作の技術をもつ集団が大挙して日本に移住 ...