| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> mysql第五话 - mysql索引原理分析 -> 正文阅读 |
|
[大数据]mysql第五话 - mysql索引原理分析 |
在工作中听到最多的一句话,sql查询太慢怎么办?加个索引吧! 今天来探索一下mysql的索引原理。 1.索引是什么?可以毫不夸张的说,系统中sql的快慢,是能直接决定你系统的快慢的。但是sql的快慢就看索引的好坏了。 2.索引划分
3.索引数据结构选型各种二叉树数据结构在线演示传送门,下面贴的传送门均来源此地址 3.1 哈希表(Hash)innoDB自适应的。
通过id这个索引key进行hash函数计算定位到14这个桶0x72,这个地址就是存储id=7数据的物理地址,取值复杂度为O(1) 3.2 二叉查找树(BST)二叉树特点:
但是普通的二叉树有个致命的缺点,极端情况下回蜕变成线性链表,查询也变成复杂度O(n),检索速度大大降低 3.3 AVL树和红黑树二叉查找树存在不平衡问题,因此在可以通过节点上自动旋转来让二叉树始终保持基本平衡的状态,基于这种思路的自调整平衡状态的二叉树就有AVL树和红黑树。 3.3.1 红黑树传送门,红黑树动画在线演示
从上图可以看出问题,新增id为16或者查找id=15的时候需要计算节点数为6次,而且数据库主键一般都是自增百万千万的,“右倾“这种趋势是一值存在的,不管是插入还是新增都有一定的性能影响。 3.3.2 AVL树官方:AVL是一个绝对平衡的二叉树。
但是数据库的查询瓶颈在于磁盘IO,如果使用的是AVL树,查询大数据ID时存在的IO次数还是会有很多次,这是不能接受的。 3.4 B树磁盘IO有个特点,就是读取1B和读取1KB数据所消耗的时间是一致的。为了减少磁盘IO,我们可以在一个树节点上多存储一点数据,每次磁盘IO就多加载一点到内存,这就是B树,B+树的设计原理。 如上图:三阶的B树,查询id=7的数据只需要进行两次IO,查询结果是优于AVL树的。
3.5 B+树B+树是B树的一种变体,目前mysql的索引数据结果正是B+树,相比B树B+树有什么不同呢?
而这个链表本身就是有序的,在数据范围查询时,效率有效的提升。所有说作为Mysql的索引的数据结构最为合适。 4.Mysql中 InnoDB和Myisam引擎索引的实现4.1 Myisam引擎先回顾一下Myisam引擎的特点,查询基于内存,性能极佳,但是不支持事务。
查看生成目录
来到对应目录可以看到有以下文件,frm是每个表都有的存储的是表基本信息。
4.2 myisam底层索引的实现Myisam使用的是索引文件和数据文件分开的形式,这种叫做非聚集索引。 4.3 InnoDB引擎InnoDB引擎的特点:默认存储引擎,事务安全特性、奔溃恢复能力、行级别锁、一致性非锁定性读
来到对应目录可以看到有以下文件,frm是每个表都有的存储的是表基本信息。
4.4 innoDB底层索引的实现索引即数据 数据即索引 。如果在有主键的情况下会根据主键建立聚集索引。如果没有主键的情况下就看索引逻辑顺序和数据行的存储顺序一致的字段建立聚集索引。 5.索引建立规则5.1 每个地址都建立索引
5.2 列的离散度
5.3 联合索引
5.4 覆盖索引如果你select中的所有列都包含在用到的索引中,就不需要回表
5.5 索引下推
5.6 那些字段适合创建所有
5.7 什么情况用不到索引
5.8 一个a,b,c的索引,那些情况可以走?
6.总结本文探索了可以作为索引的数据结果对比,最终得知B+树最为适合。同时分析了mysql中最为经典的两种数据引擎InnoDB和Myisam,在索引的底层实现上各有不同,但也各有千秋。 以上就是本章的全部内容了。 上一篇:mysql第四话 - mysql bin log的开启及使用 莫倚儿童轻岁月,丈人曾共尔同年 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:44:52- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |