(2)Mysql索引原理和优化总结
Mysql设计原理栏目总结
(1)Mysql架构和常用引擎介绍
(2)Mysql索引原理和优化总结
1.索引理解和常见面试题
(1)本质
索引是一种能够高效获取数据的数据结构
索引存放在硬盘上
(2)常见面试问题
①为什么用B+,而不用B、红黑树、AVL、二叉查找、Hash、跳表
二叉(不平衡):如图单边增长插入,查找最大值和全表扫描一样
树平衡(二叉->AVL):二叉查找树可能出现树不平衡,但AVL二叉平衡树是平衡的(查找会稳定些)!
树高度/多路平衡(AVL->Btree):AVL子节点数少于B树,树高度必然会高于B树(红黑树也一样,高度较高)。减少树高度那需要在节点中多存储一些数据。否则在查找数据时,高度太高,会造成IO浪费。
二叉平衡和红黑树:如图
红黑树和B树:①跳表适合范围查找 ②跳表和红黑树在查找单值下性能均为O(log n) ③当跳表中链表层次越多,查找所经过的节点越少。因为跳表可以牺牲空间复杂度换取良好的时间复杂度扩展性
节点结构(B-tree->B+-tree):
①节点空间使用率高: 1.B树非叶节点除了存储子节点指针还要存储数据,而B+树非叶节点数据存储在叶节点中。2. B树叶子节点为空
②查找稳定性:因为B+不同于B树,非叶子节点不存目标数据。虽然查根节点和靠近根节点的数据B树会更快一些,但整体上B+稳定性高于B树。比如Innodb中页的默认大小为16KB,B+树可以存储更多的键值,相应的树阶数更大,最终整棵树又矮又宽。那么在查找数据的时候,整体上来说平均IO使用次数是少于B树,所以说是稳定的(因为有的目标值靠近头节点、有点目标值在叶子节点,不容易控制)。
③扫表和排序速度更快:因为B+叶子节点用链表串起来,如果用范围、排序或者分组查找,只需要遍历一条链表即可。
④IO能力加强:由于B+非叶子不存目标数据(B树有关键字+数据区+子节点引用,B+只有关键字+子节点指针),B+非叶子就可以存放更多的键值信息(边宽了),所以在查找叶子节点的目标数据时,所进行的IO操作次数是少于B树。
Hash和B+区别
①回表:Hash索引查找时是通过调用hash函数获取键值,再查表获取数据,因此无法避免回表。B+在聚簇、覆盖索引等场景下查找可以不回表。
②查询方式:Hash等值查询时更快但不能进行范围查找。因为hash索引在在建立索引后,索引顺序无法保证。而B+所有节点都大小排序关系
③冲突:Hash虽然等值查询快,但是不稳定。当键值重复多时,容易发生hash碰撞效率低。而B+树所有查询都是从根节点查到叶子节点,且高度较低。
②MyIsam和Innodb的B+ 区别
存储结构不同:MyIsam中B+索引的叶子节点是数据的文件地址(不管是主键还是非主键,都会被分开)。而Innodb叶子节点存储的真正的行记录。
聚簇和非聚簇(同上):Innodb中只有主键是聚集索引,其他都是非聚集索引(辅助索引叶子节点存放的是主键的值)。另外由于Innodb数据文件按主键聚集,要求表必须有主键,如果不存在则生成一个6字节的长整形作为隐含的主键。
③为什么Innodb辅助索引不在叶子节点存储行数据
容量太大:如果辅助索引和主键索引都存储行数据,那么索引结构占用硬盘空间自然很大,甚至比原来的行数据所占用的容量大很多。
④为什么不建议使用UUID,而建议主键ID是递增的
页分裂(添加)和合并(删除):使用连续递增ID的插入都是针对最后一个叶子节点(叶子链表末尾)。而非连续的插入可能导致先前的节点。
叶节点容量:自增id为int类型只用四个字节,而UUID是varchar占用更多字节,而且还会影响查询速度。
⑤为什么Innodb一定要建立主键索引
默认主键索引:若无主键索引,则自动创建默认特殊int主键。但为6个字节的int类型主键,太占据资源(比原int容量更大,但上限还是2^32)。
主键选择安全:当表行数据为2^32-1时,如果再增加数据,则重新从0开始累加。可以采用Bigint等更大的类型统计索引号。
主键并发隔离:行锁默认转变成表锁!!
2.不同索引结构详解
(1)哈希表(key-value):
hash将key换算成确定的位置,然后把value放在数组后面的位置
优点:适用于只有等值查询的场景
缺点:由于value无序,做区间查询很慢。
(2)有序数组
优点:适合等值查询和范围查询场景。复杂度O(log(N))
缺点:更新数据麻烦(不如链表)
(3)二叉搜索树
优点:复杂度O(log(N))
缺点:索引结构耗费存储空间、单独访问效率低(一颗100万节点平衡二叉树,树高20。一次查询访问20数据块,磁盘随机读写一块约10ms.如果扫表操作100万行数据那么非常慢)
(4)普通B树
优点:①比二叉树低,且结构也平衡 ②非叶子节点上存放值 ③m叉平衡查找树,所有叶节点在同一层(保持平衡)
缺点:①查找效率不稳定(上下不均匀)
【B树节点表示】
(5)B+树
优点:①相比与B树 I/O查找均衡(一个数据块/节点看出页);
②叶子节点链表结构(头最小尾最大);
③非叶节点只起到索引作用,叶节点存放数据记录
④B+和B树高原因主要在页能否存放更多记录,其次是结构(1. 系统页大小固定4kb,非页节点只存主键信息和指向其他节点/页的指针不必存数据记录,因此节点或数据块中的关键字比B树多很多。2. B+根节点有多个关键字,而B根只有一个)。见下推导B+高度案例
- 缺点:①维护困难(当节点所在的数据页满时,会产生页分裂。这时需要申请一个新的数据页,这时挪动部分数据过去);
②页分裂降低空间率利用率
【B+树高度计算】
- 由于操作系统页大小设定一般为4kb(文件系统中最小为1kb,但占用磁盘4KB大小)
MySQL 中我们的 InnoDB 页的大小默认是 16k,若 一行数据的大小是 1k,那么一个页可以存放 16 行这样的数据。则树为17阶。
B+树非页不存数据则。若树高为2,则B+存放记录数为 根节点指针数 * 单个叶子节点记录行数(16k/1k)=1170*16=18720 。若数高大于2,非页节点存放指针数= 16kb(16384字节)/14字节(主键为biginit8字节+指针大小6字节),则高度为3 能存放 1170*1170*16=21902400 条。
3.索引应用分类
(1)聚簇/主键索引:叶子节点存整行数据(避免每次查询搜索两棵树)
注:主键索引不要选择太长的字段,否则非主键索引的叶子节点全是长字段主键值,那么普通索引空间占用大。
非聚簇/非主键:叶子节点为主键的值(若查询条件为非主键值,找到后再到主键索引数中搜索一次)
(2)单值索引/唯一索引/复合索引
(3)联合索引:联合索引: 联合索引还是一棵B+树,不同的是联合索引的键值数量大于1。其优势如下:
①减少开销: 建一个联合索引(a,b,c),实际相当于建了(a),(a,b),(a,b,c)三个字段组合,没有(a,c),见最左原则。由于Mysql查询时只使用一个索引,所以相比于单列索引查询效率更好。
(4)覆盖索引:叶子节点值满足查询需求(例如只想根据 ino 索引查ID值)。
4.索引优化应用场景(待补充)
(1)回表
①若查询非主键索引树时,叶子节点只有主键值,则还要去主键索引结构(其他索引)查找值。
例如主键为id,select * from table where id= xx和select id from table where id= xx都不用回表
(2)最左原则
①查询规则:如有索引(a,b,c)
基本情况: 1.优化器会分析SQL语句,将其优化成索引可以匹配的形式; 2.只有先确定了前一个(左侧的值)后,才能确定下一个值
联合索引会优化范围查询
联合索引会优化模糊查询
最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。
②查询原理:
联合索引的键值数量有多个。由于B+树只能根据一个值构建,因此会依据联合索引最左字段构建B+。
其中的非叶子节点存储的是第一个关键字的索引 a,而叶子节点存储的是三个关键字的数据。这里可以看出 a 是有序的,而 b,c 都是无序的。但是当在 a 相同的时候,b 是有序的,b 相同的时候,c 又是有序的。
如: select * from t where name=5 and age>0 and job =1 ,当查询到 age 值时(这是一个范围值),job为 无序。所以索引失效。
(3)统计信息影响索引
例如sessionA开启一个事务,随后SessionB把数据删除,又调用idata存储过程,插入了10万行数据。这时SessionB执行select * from t where a between 10000 and 20000 却不会选择索引a。
现在强制增加索引进行对比测试,然后开启慢查询让所有数据库实例执行的语句都被记录到日志中。
(2)Mysql索引原理和优化总结相关推荐
- Mysql 索引原理及优化
本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...
- MySQL - 索引原理及其优化
前言 网上都说学会mysql需要学会两个部分,索引和事务,其实在最近的Mysql学习过程中,我觉得应该是有三个部分的,索引,查询,事务.其中的查询主要是指查询优化即编写高效率的SQL语句. 本文记录一 ...
- MySQL索引原理及其优化
前言 网上都说学会mysql需要学会两个部分,索引和事务,其实在最近的Mysql学习过程中,我觉得应该是有三个部分的,索引,查询,事务.其中的查询主要是指查询优化即编写高效率的SQL语句. 本文记录一 ...
- MYSQL索引原理,优化SQL
索引类型:B tree(mongodb),B+ bree(Mysql),hash mysql引擎:innodb myisame memory B tree:多路平衡搜索数,degree代表最多分的叉. ...
- mysql gis index 索引原理_Mysql 索引原理及优化
Mysql 索引原理及优化 什么是索引 为什么需要索引? 索引是数据表种一个或者多个列进行排序的数据结构 索引能够大幅提升检索速度 创建.更新索引本身也会耗费空间和时间 查找结构进化史 线性查找:一个 ...
- (转)MySQL索引原理及慢查询优化
转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...
- 干货:MySQL 索引原理及慢查询优化
转载自 http://blog.csdn.net/kaka1121/article/details/51815368 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首 ...
- MySQL索引原理及慢查询优化
背景 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师 ...
- MySQL索引原理及慢查询优化,了解一下?
MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库. 虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必 ...
最新文章
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls 水题
- “盗”亦有道,关于robots协议
- Linux buffer/cache异同
- C++线程同步之事件(生产者与消费者问题)
- 【城市沙龙】LiveVideoStack Meet|西安:人文历史遇到流媒体算法
- win10防火墙删除的文件在哪里_Win10系统我们是否还需要安装360
- 整理Linux查看系统日志的一些经常使用命令
- python十条建议_十条建议帮你提高Python编程效率
- 投稿指南 | 云计算领域最前沿资讯、技术,期待您的专业解读!
- psftp 上传下载文件
- python中的序列类型数据结构元素的切片操作_浅析python中的分片与截断序列
- 基于tensorflow实现图像分类——理解神经网络运作过程、tensorflow入门
- 鸿蒙系统即将发布,华为鸿蒙商标获转让
- Openstack Object Store(Swift)设置公有存储的方法
- 电子相册系统(四)用户登录
- 【转】Quartz.NET快速入门指南
- PLSQL使用ODBC导入EXCEL时DSN无下拉选项
- 论软件测试工程师面试套路和暗语灵魂解密
- STM32单片机OLED俄罗斯方块单片机小游戏
- 太可怕了!人工智能逐渐取代客服?原因竟然是这个