转载自  面试 - 要不简单聊一下你对MySQL索引的理解?

MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来。

一、索引是什么?

索引是帮助MySQL高效获取数据的数据结构。

二、索引能干什么?

索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。 索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。

三、索引的分类?

1、从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。这里所描述的是索引存储时保存的形式,

2、从应用层次来分:普通索引,唯一索引,复合索引

3、根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。

平时讲的索引类型一般是指在应用层次的划分。

就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。

普通索引:即一个索引只包含单个列,一个表可以有多个单列索引

唯一索引:索引列的值必须唯一,但允许有空值

复合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。

非聚簇索引:不是聚簇索引,就是非聚簇索引

四、索引的底层实现

mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。

不谈存储引擎,只讨论实现(抽象)

Hash索引

基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。

B-Tree索引(MySQL使用B+Tree)

B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。

B+Tree索引

是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。

结合存储引擎来讨论(一般默认使用B+Tree)

案例:假设有一张学生表,id为主键

idnamebirthday1Tom1996-01-012Jann1996-01-043Ray1996-01-084Michael1996-01-105Jack1996-01-136Steven1996-01-237Lily1996-01-25

在MyISAM引擎中的实现(二级索引也是这样实现的)

在InnoDB中的实现

五、为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树?

B+tree:因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;

Hash:虽然可以快速定位,但是没有顺序,IO复杂度高。

二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。

红黑树:树的高度随着数据量增加而增加,IO代价高。

六、为什么官方建议使用自增长主键作为索引?

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。

插入连续的数据:

插入非连续的数据

七、简单总结下

1、MySQL使用B+Tree作为索引数据结构。 2、B+Tree在新增数据时,会根据索引指定列的值对旧的B+Tree做调整。 4、从物理存储结构上说,B-Tree和B+Tree都以页(4K)来划分节点的大小,但是由于B+Tree中中间节点不存储数据,因此B+Tree能够在同样大小的节点中,存储更多的key,提高查找效率。 5、影响MySQL查找性能的主要还是磁盘IO次数,大部分是磁头移动到指定磁道的时间花费。 6、MyISAM存储引擎下索引和数据存储是分离的,InnoDB索引和数据存储在一起。 7、InnoDB存储引擎下索引的实现,(辅助索引)全部是依赖于主索引建立的(辅助索引中叶子结点存储的并不是数据的地址,还是主索引的值,因此,所有依赖于辅助索引的都是先根据辅助索引查到主索引,再根据主索引查数据的地址)。 8、由于InnoDB索引的特性,因此如果主索引不是自增的(id作主键),那么每次插入新的数据,都很可能对B+Tree的主索引进行重整,影响性能。因此,尽量以自增id作为InnoDB的主索引。

面试 - 要不简单聊一下你对MySQL索引的理解?相关推荐

  1. 面试官:聊一下你对MySQL索引的理解?

    作者:浪人 来源:http://t.cn/AiKmcEef MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来. 一.索引是什么? 索引是帮助MySQL高效获取数据的数 ...

  2. 面试官:聊一下你对MySQL索引实现原理?

    在数据库中,如果索引太多,应用程序的性能可能会受到影响,如果索引太少,又会对查询性能产生影响.所以,我们要追求两者的一个平衡点,足够多的索引带来查询性能提高,又不因为索引过多导致修改数据等操作时负载过 ...

  3. MySQL索引的理解学习,面试不问索引原理就是事务原理

    目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B+树 B+树(聚集索引) B+树(辅助索引) 思考一下为何使用B+树结构, 不是B ...

  4. MySQL索引原理理解

    本文将渐进式的帮助理解mysql中innoDB的索引原理,InnoDB存储引擎是以页为单位进行存储的,一页的大小是16kb 1.InnoDB的行记录: 本次行记录的叙述主要以 COMPACT为主,其他 ...

  5. 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)

    title: 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了) tags: 面试常见题 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈 ...

  6. 《破壁MySQL》 - MySQL索引

    文章每周六持续更新,可以微信搜一搜「 荒古传说 」抢先阅读. 在上一篇文章 「<破壁MySQL> - MySQL概述」 中我们简单介绍了MySQL 架构和 MySQL 存储引擎的相关知识, ...

  7. 五个维度着手MySQL的优化,我和面试官都聊嗨了

    面试官如果问你:你会从哪些维度进行MySQL性能优化?你会怎么回答? 所谓的性能优化,一般针对的是MySQL查询的优化.既然是优化查询,我们自然要先知道查询操作要经过哪些环节,然后思考可以在哪些环节进 ...

  8. 不会MySQL索引,面试官让回家等通知!

    " 你是不是对于 MySQL 索引的知识点一直都像大杂烩,好像什么都知道,如果进行深究的话可能一个也答不上来. 假如你去面试,面试官让你聊一下对索引的理解,然而你对索引的理解仅限于,检索数据 ...

  9. 地域面试:先来谈谈对MySQL索引的认识?

    你经历过地狱级的面试吗?血淋淋的教训告诉你 你好,x先生,欢迎来我们公司面试,不用太紧张,我们简单聊一个 好的,谢谢您 看了你的简历,之前对mysql数据库了解挺多的,我们先来聊聊数据库怎么样? 好的 ...

最新文章

  1. Shiny平台构建与R包开发(四)——按钮与响应事件
  2. Spring5的系统架构
  3. groovy使用范型的坑
  4. Photoshop的绘图工具
  5. leetcode初级算法6.字符串转整数(atoi)
  6. 教师资格证计算机考察知识点,教师资格证考试信息技术常考知识点同步练习题.docx...
  7. 加载tf模型 正确率很低_深度学习模型训练全流程!
  8. oracle数据库日期加一,日期和Oracle数据库
  9. 【Servlet】getInitParameter()发生空指针导致HTTP500的解决方案
  10. [开源][J2ME]J2ME手机应用程序UI开发框架
  11. php redis 设置,php设置redis扩展,你值得拥有
  12. response.contenttype
  13. Seinfeld(杭电3351)
  14. 使用FlashBoot3.2c 将 U 盘制作成 DOS 启动盘
  15. ruoyi 若依 VUE 宝塔 Nignx部署 伪静态配置
  16. 使用photoshop对图片像素级的标注
  17. 文本数据分析:删除停用词
  18. 停车场停车系统软件测试报告,智慧停车场系统各大功能系统的详解
  19. 破解这「七宗罪」,你才能晋升高级运营
  20. 语言的翻译叫什么_独家整理MTI翻译硕士复试必考的翻译理论、策略和技巧

热门文章

  1. JVM笔记详解之垃圾回收器
  2. [JavaWeb]Web概念概述
  3. [蓝桥杯2017决赛]平方十位数-枚举+set去重
  4. 汉诺塔 X HDU - 2511
  5. Android studio 实验过程中遇到的问题之android.support.v7.app.AppCompatActivity不能使用的解决办法
  6. java8 stream 最大值_JDK8-Stream流常用方法
  7. 如何看待潘石屹搞python_潘石屹考了99分的Python,到底是一种什么存在?
  8. android 按钮 菜单,(期末要考啊)Android的menu(菜单)按钮的使用
  9. 统计学习笔记(1) 监督学习概论(1)
  10. 【AcWing 243. 一个简单的整数问题2】