MyISAM引擎的B+Tree索引结构

我们知道对于MyISAM引擎而言,数据文件和索引文件是分离的。从图中也可以看出,通过索引查找到后,就得到了数据的物理地址,然后根据地址定位数据文件中的记录即可。这种方式也叫"非聚集索引"。

而对于Innodb引擎而言,数据文件本身是索引文件!通俗点说,叶子节点上,MyISAM存储的是记录的物理地址,而Innodb上存储的是数据内容,这种方式即"聚集索引"。

另外一点需要注意的是,对于Innodb而言,主键索引中叶子节点存储的是数据内容,而普通索引的叶子节点中存储的是主键值!也就是说,对于Innodb的普通索引字段查找,先通过普通索引的B+Tree查找到主键后,然后通过主键索引的B+Tree进行查找。从这里你可以看出,对于Innodb而言,主键的建立非常重要!

而对于MyISAM而言,主键索引和普通索引仅仅的区别在于主键只需要查找到一条记录即可停止,而普通索引允许重复,找到一条记录后需要继续查找,在结构上没有区别,如上图所示。

深入B+Tree

提几个问题:

为什么B+Tree把真实的数据放到叶子节点,而不是内层节点?

为什么我们说索引字段要尽可能短,最好是单调递增的?

为什么复合索引存在最左匹配原则?

范围查询(>,

关于B+Tree的一些数学理论,咱们就不玩了,至少一点可以肯定的是:数据表的数据量N=F(树的高度h,每个Block存储的索引的个数m)。在N一定的情况下,索引字段越小,那么m会越大,这意味着h将越小!树越低,当然查找的更快!

如果内层节点存放真实的数据,显然m会变小,树将变高。

在实际应用中,我们应该尽可能采用单调递增的字段作为主键,一方面不会使得索引的数据结构变大,减小了索引占用的空间;另一方面也不会频繁的分裂B+Tree,使得效率下降。

比如复合索引(name,age,sex),B+Tree会优先比较name来确定下一步的搜索方向。如果突然来了个(age,sex),根本上就无从下手。这也是符合常理的,对于一本书,我们说“找到第几章第几节的XXX”,从没有听说过“找到第几节的XXX”!这是复合索引的重要特性,即最左匹配特性。

假设存在复合索引(name,age,sex),我们在进行select的时候,并没有按照这个顺序进行,而是sex = 'man' and name = 'zfz' and age = 27,是否会使用索引呢?数据库是很聪明的,在SQL优化的时候,会自动帮助我们调整!但是如果缺失了复合索引的第一列,数据库也将无能为力呢。

对于最左匹配,MySQL会一直向右匹配直到遇到范围查询就停止匹配。什么意思?比如复合索引(name,age,sex),对于name = 'zhangfengzhe' and age > 26 and sex = 'man',实际上只利用到了复合索引的name列。

想利用索引,就得“干净”

什么叫“干净”?就是不要让索引参与计算!比如在索引上应用函数,很可能导致索引失效。为什么呢?

其实不用想,B+Tree上存储的是数据,要比较的话,需要把所有的数据都应用上函数,显然成本太大。

想建立索引,看看区分度

索引虽然物美价廉,但是也别乱来。count(distinct col) / count(*)可以算一下col的区分度,显然对于主键而言,就是1。区分度太低的话,可以考虑下,是否还有必要建立索引呢?

Hash索引

这里并不是要深入分析Hash索引,而是要说明一下Hash的思想真是无处不在!

在MySQL的Memory存储引擎中,存在hash函数,给一个key,通过hash函数进行计算得到地址,所以通常情况下,hash索引查找,会非常快,O(1)的速度。但是也存在hash冲突,和HashMap一样,通过单链表的形式解决。

思考下,hash索引是否支持范围查询呢?

显然是不支持的,它只能给一个KEY去查找。就如同HashMap一样,查找key包含"zhangfengzhe"的,会很快么?

SQL优化神器:explain

SQL优化的场景很多,网上的技巧也很多,完全记不住!

要想彻底解决这个问题,我想只有把索引背后的数据结构和原理做适当的理解,遇到书写SQL或者SQL慢查询的时候,我们有基础去分析,再利用好explain工具去验证,就应该问题不大呢。

explain查询的结果,可以告诉你哪些索引正在被使用,表是如何被扫描的等等。这里我将演示个Demo。

数据表student:

专家程序员要了解的mysql_从程序员的角度深入理解MySQL相关推荐

  1. 从程序员的角度深入理解MySQL

    前言 作为一名工作了4年的程序猿,今天我将站在程序员的角度以MySQL为例探索数据库的奥秘! 数据库基本原理 第一,数据库的组成:存储 + 实例 不必多说,数据当然需要存储:存储了还不够,显然需要提供 ...

  2. 一个完整的嵌入式程序_放下偏见,原来嵌入式程序员如此“妖娆”!

    感兴趣的小伙伴可以来我的Java交流群,可以获取免费的学习资料 828 697 593 对Java技术,架构技术感兴趣的同学,欢迎加群,一起学习,相互讨论. 竟然都看到最后了,给小编点个关注吧,小编还 ...

  3. 程序员创业:高智商的程序员为什么创业却屡屡失败?

    需要有哪些准备,自己还有什么不足等等这些问题你考虑过吗?本文就跟大家分享周鸿祎在接受某媒体采访时给程序员上的创业课. 程序员创业的特别之处 关于程序员创业,我之所以愿意谈我的观点,是因为我是程序员出身 ...

  4. Java程序员情人节_七夕情人节 Java程序员如何表白

    作为程序员都有女朋友吗,木有女朋友的怎么办呢,也许你认为好办,那就一个字,追.看过<爱是从表白开始的>没,怎么着也得有个轰轰烈烈滴表白啊!下面就来看看程序员怎如何在七夕情人节来个创意表白吧 ...

  5. Java程序员的专属社区 |【Java程序员大本营】新人必看玩转攻略

    "一个人走的快,一群人走的远" 这是Java程序员专属社区创立的初衷. [Java程序员大本营]是面向工作1-3年,希望提升专业技术能力的Java 开发者建立, 致力于Java知识 ...

  6. 什么样的程序员才算成熟? 让程序员认清自己的所处的阶段

    http://www.nowamagic.net/librarys/veda/detail/1450程序员在经历了若干年编程工作之后,很想知道自己水平到底如何?自己是否已经成为成熟的程序员?虽然程序员 ...

  7. 轰动程序员圈的大事:女程序员将代码写到退休,返聘再续传奇

    作者 | 金艳 来源 | 盛安德软件(ID:shinetechsoftware) 谁说程序员是吃青春饭的,最近看到一场程序员的退休趴,女程序员代码写到退休,退休后再反聘继续服务客户.那些宣扬" ...

  8. 程序员要避免的五种程序注释方式

    导读:注释,本是提高代码可读性.让其他开发人员更快速地理解程序的,然而一些无意义的注释会让人郁闷至极.本文是国外网站GreaterGeek上的一篇文章,作者通过分类介绍了五种一定要避免的程序注释方式. ...

  9. 小程序获取头像试试水 02《 程序员变现指南之 微信QQ 小程序 真的零基础开发宝典》

    本系列教程是针对粉丝的变现教程,还不是粉丝的可以关注我并且到社区:https://bbs.csdn.net/topics/603436232 进行打卡,不是老粉的也可以获取最终的技术变现学习,最终还有 ...

  10. 笑看职场什么程序员才抢手,什么样的程序员涨薪多?

    ​程序员,怎么才算合格,不好说吧:他就像销售一样,一名销售员,比如网络销售卖茶叶,他卖茶叶很厉害呀,可是你让他去销售房地产,就算他有点销售的基础,也要重新去学怎么销售房地产,因为销售的东西是不一样的, ...

最新文章

  1. GCD Counting
  2. 【工具】克隆题库(适用于所有以POJ2005-2017为模板的OJ平台)
  3. oracle 事务_从Oracle到PG-PostgreSQL的MVCC机制简介
  4. SpringMVC解决静态资源不能访问
  5. python 伪多线程_Python实现简单多线程任务队列
  6. 【转】学习理论,注重细节
  7. 基础总结篇之二:Activity的四种launchMode
  8. 纯c++实现之滚动窗口
  9. 灰色系统理论与灰色关联分析模型
  10. 深度学习的视觉跟踪:一个全面的调查
  11. CATIA V6 二次开发—概述
  12. js给页面添加随机像素噪声背景
  13. Infor M3咨询服务调研报告-Infor M3咨询服务生产基地、总部、竞争对手及市场地位
  14. 你的孤独,正在撑起一个万亿级市场
  15. 公司名称怎么申请专利
  16. 简书爬ajax接口获取csrf,Python爬取简书主页信息
  17. 北京邮电大学自考计算机试题及答案,6所北京高校在河南拟招630人 28个自考专业停考...
  18. 滑铁卢计算机专业世界最新排名,滑铁卢大学计算机专业世界排名介绍
  19. 聚苯乙烯和可膨胀聚苯乙烯的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. Matlab,C/C++语言读取RAW图和保存RAW图

热门文章

  1. 六、hibernate之HQL
  2. Sublime Text 插件 【转】
  3. mac 安装android sdk
  4. classloader隔离练习
  5. xcode UIView常用方法属性动画
  6. eclipse中MAVEN的web项目部署至TOMCAT的步骤
  7. Oracle Database 11g 下载
  8. ***必学的DOS命令
  9. 10.高性能MySQL --- 复制
  10. Spring中利用配置文件和 value注入属性值