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索引原理和优化总结相关推荐

  1. Mysql 索引原理及优化

    本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...

  2. MySQL - 索引原理及其优化

    前言 网上都说学会mysql需要学会两个部分,索引和事务,其实在最近的Mysql学习过程中,我觉得应该是有三个部分的,索引,查询,事务.其中的查询主要是指查询优化即编写高效率的SQL语句. 本文记录一 ...

  3. MySQL索引原理及其优化

    前言 网上都说学会mysql需要学会两个部分,索引和事务,其实在最近的Mysql学习过程中,我觉得应该是有三个部分的,索引,查询,事务.其中的查询主要是指查询优化即编写高效率的SQL语句. 本文记录一 ...

  4. MYSQL索引原理,优化SQL

    索引类型:B tree(mongodb),B+ bree(Mysql),hash mysql引擎:innodb myisame memory B tree:多路平衡搜索数,degree代表最多分的叉. ...

  5. mysql gis index 索引原理_Mysql 索引原理及优化

    Mysql 索引原理及优化 什么是索引 为什么需要索引? 索引是数据表种一个或者多个列进行排序的数据结构 索引能够大幅提升检索速度 创建.更新索引本身也会耗费空间和时间 查找结构进化史 线性查找:一个 ...

  6. (转)MySQL索引原理及慢查询优化

    转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...

  7. 干货:MySQL 索引原理及慢查询优化

    转载自 http://blog.csdn.net/kaka1121/article/details/51815368 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首 ...

  8. MySQL索引原理及慢查询优化

    背景 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师 ...

  9. MySQL索引原理及慢查询优化,了解一下?

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库. 虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必 ...

最新文章

  1. IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) A. Bear and Three Balls 水题
  2. “盗”亦有道,关于robots协议
  3. Linux buffer/cache异同
  4. C++线程同步之事件(生产者与消费者问题)
  5. 【城市沙龙】LiveVideoStack Meet|西安:人文历史遇到流媒体算法
  6. win10防火墙删除的文件在哪里_Win10系统我们是否还需要安装360
  7. 整理Linux查看系统日志的一些经常使用命令
  8. python十条建议_十条建议帮你提高Python编程效率
  9. 投稿指南 | 云计算领域最前沿资讯、技术,期待您的专业解读!
  10. psftp 上传下载文件
  11. python中的序列类型数据结构元素的切片操作_浅析python中的分片与截断序列
  12. 基于tensorflow实现图像分类——理解神经网络运作过程、tensorflow入门
  13. 鸿蒙系统即将发布,华为鸿蒙商标获转让
  14. Openstack Object Store(Swift)设置公有存储的方法
  15. 电子相册系统(四)用户登录
  16. 【转】Quartz.NET快速入门指南
  17. PLSQL使用ODBC导入EXCEL时DSN无下拉选项
  18. 论软件测试工程师面试套路和暗语灵魂解密
  19. STM32单片机OLED俄罗斯方块单片机小游戏
  20. 太可怕了!人工智能逐渐取代客服?原因竟然是这个

热门文章

  1. OpenLayers学习笔记高级篇(四、地图开发实战之地图要素的增删改查)
  2. jQuery遍历页面中的标签
  3. 什么软件可以测试吃鸡帧数,gtx750ti吃鸡多少fps,实际测试一下
  4. Vue.js中文官网打开很慢
  5. js 逻辑空分配双问号语法 、双竖杠语法 与 可选链语法
  6. 【闲聊杂谈】直击重灾区 - 多线程与高并发
  7. Mysql共享锁和排他锁
  8. linux adc检测,Linuxatsadc输入文件如何检查漏洞?
  9. SolidWorks242个使用技巧
  10. 学习计算机的学生有没有必要熟练盲打