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+树
mysql索引原理深度解析的更多相关文章
- mysql索引原理及用法
MySQL索引原理及慢查询优化 Mysql explain用法和性能分析 MySQL 索引优化全攻略 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提 ...
- [转] MySQL索引原理
MySQL索引原理 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉 ...
- Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...
- MySQL 索引原理以及慢查询优化
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree ...
- MySQL索引原理及慢查询优化
原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...
- (转)MySQL索引原理及慢查询优化
转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...
- MySQL索引原理及慢查询优化 转载
原文地址: http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...
- MySQL索引原理及慢查询优化(转)
add by zhj:这是美团点评技术团队的一篇文章,讲的挺不错的. 原文:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰 ...
- 【转载】MySQL索引原理及慢查询优化
原文链接:美团点评技术团队:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型 ...
随机推荐
- 基于物品的协同过滤(ItemCF)
- B 树 B+树
拜读了 http://blog.csdn.net/v_july_v/article/details/6530142, 自己总结下: B树的出发点是为了解决磁盘IO慢的问题,尽量再一个磁盘块中提供更 ...
- 快速失败and安全失败
快速失败: 举个栗子: public static void main(String[] args) { ArrayList<String> list=new ArrayList<& ...
- react使用阿里爸爸的iconfont时,不展示的问题
选择使用Unicode时: 正常使用如下,显示也是正常: <i className="iconfont"></i> 使用map去循环时,需将原本的,改成 ...
- Android中的Parcel机制(上)
一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态, ...
- php-fpm 服务
编译安装PHP的时候已经加入了--enable-fpm 在此基础上启动php-fpm服务 cp /usr/local/php/etc/php-fpm.conf.default /usr/local/p ...
- android 插件化框架VitualAPK
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) LeakCanary 与 鹅场Matrix ResourceCa ...
- NX二次开发-UFUN批量操作图层状态UF_LAYER_set_many_layers_status
NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_layer.h> UF_initialize ...
- csp-s模拟测试98
csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...
- [JZOJ 5818] 做运动
题意:带温度最短路. 思路: 我们将温度从小到大的将边加入,用并查集维护连通性. 如果一旦联通那么跑一遍\(spfa\)就可以得到答案. 复杂度\(O(m log m)\) #include < ...