这是2014阿里实习生北京站二面的一道试题:

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比如MyISAM和InnoDB存储引擎。

MyISAM索引实现:

MyISAM存储引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。MyISAM的索引方式也叫做“非Ju集”的,之所以这么称呼是为了与InnoDB的ju集索引区分。

InnoDB索引实现:

虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

第一个重大区别是:InnoDB的数据文件本身就是索引文件。

第二个与MyISAM索引的不同是:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。ju集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

其实,数据库索引的实现可以采用红黑树,B-Tree树数据结构。

但是为什么实际上采用的B+Tree呢?

这要从计算机存储原理和操作系统相关知识说起。因为数据表的索引比较大,不能常驻内存,所以以文件形式存储在磁盘中。所以当查询数据的时候就需要I/O操作。高效率查询的目标是较少I/O次数。一次I/O一般读取一页(一般为4k)大小的数据(局部性原理)。如此,在B-树中,每当申请一个新结点时,就以页的大小来申请。也就是说一次I/o可以读取一个一个结点(包含很多key)的数据;而在红黑树结构结构中,逻辑相邻的结点物理上不一定相邻,就是说,读取同等的数据需要多次I/O。所以选择B-树效率更好。

那为何最终选了B+树呢?

因为B+树内节点去掉了data域,因此可以拥有更大的出度,就是说一个结点可以存储更多的内结点,那么I/O效率更高。

了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

ju集索引与非ju集索引之分:

InnoDB是ju集索引,因为它的B+树的叶结点包含了完整的数据记录。而MyISAM方式B+树的叶结点只是存储了数据的地址,故称为非ju集索引。

索引使用策略及优化

MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)。详情查看此文:

《MySQL索引背后的数据结构及算法原理》

注:聚,都用ju代替,ju集居然是敏感词,太坑了,求破解方法

2014阿里实习生面试题——mysql如何实现索引的相关推荐

  1. mysql实习生笔试题_2014阿里实习生面试题MySQL如何实现索引的

    [相关专题推荐:mysql面试题(2020)] 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比如MyISAM和InnoDB存储引擎. MyISAM索引实现: My ...

  2. 阿里面试官:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  3. 高薪程序员面试题精讲系列89之MySQL有哪些索引?

    一. 面试题及剖析 1. 今日面试题 MySQL有哪些索引? 索引的底层原理你熟悉吗? 组合索引了解吗? 聚簇(集)索引和非聚簇(集)索引有什么区别? 什么情况下索引会失效? 2. 题目剖析 壹哥今天 ...

  4. mysql腾讯面试题_2020腾讯阿里精选面试题100+(包含答案)

    前言 武功再高,也怕菜刀,确认过眼神,你得是对的人才行.就算是技巧,也要建立在硬核实力上面. 本文总结的是关于BAT的精选面试题 由于面试题较多,篇幅过长.就没有一 一展示出来了,面试题获取看我个人介 ...

  5. 阿里2020春招Java实习生笔试题

    阿里2020春招Java实习生笔试题 第1题 第2题 今天上午参加了阿里实习笔试,2个编程题(60分钟),做的简直是惨不忍睹,一个都没出来.虽然和面试无缘了,但希望能帮到后面笔试的同学,所以将题目大概 ...

  6. 学生党如何拿到阿里技术offer:《阿里实习生面试经验(成功)》

    上次的博文为大家分享了一篇来自成功拿到阿里offer的研究生学姐的面试经验,其实阿里每年都会为大三或者研二这样的在校学生提供实习生的机会,不久之前还在微信中看到阿里淘宝招聘实习生的微信文章,虽然毕业实 ...

  7. 为进阿里刷面试题-日更

    为进阿里刷面试题-日更(加油打工人) 下面的题目都是自己理解的,如有漏,或者写错的,请指出来!加油! JAVA基础 1.JVM内存分配原理,垃圾回收原理 2.ConcurrentHashMap 和 h ...

  8. 阿里最新php面试题及答案,面经网-阿里php面试题(四)

    阿里php面试题(四) 1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.session与 ...

  9. 数据库周刊33丨5大国产数据库中标中国移动;Oracle7月CPU安全预警;腾讯Tbase新版本发布;“2020数据技术嘉年华”有奖话题遴选;阿里云技术面试题;APEX 实现数据库自动巡检;MYSQ

    热门资讯 1.中国移动国产OLTP数据库中标公告:南大金仓阿里,万里开源中兴 分获大单 [摘要]近日,中国移动公布了 OLTP 自主可控数据库联合创新项目中标公告.公告显示:国产数据库中,南大通用.阿 ...

最新文章

  1. 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)
  2. caffe实现多任务学习
  3. 怎样用uml类图生成java类_JAVA:面向对象编程的底层逻辑,深度剖析
  4. Docker-Compose简介与Ubuntu Server 上安装Compose
  5. NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间
  6. arcgis批量处理nc文件_ArcGIS处理NetCDF(.nc)的多维科学数据
  7. 水晶报表之创建子报表
  8. Mybatis(2)——Mapper映射文件
  9. lsqcurvefit拟合结果为复数_高考数学专题突破,向量运算与复数运算、算法、推理与证明,方法规律总结,知识归纳,易错示警...
  10. python多态实例_Python多态实例详解
  11. OBS 录制没有声音怎么办?
  12. JRebel:Cannot reactivate, offline seat in use.
  13. 二维数组冒泡排序 java
  14. 鼠标移到图片上图片放大
  15. BaoStock:使用python的baostock接口,查询除权除息信息
  16. 网页是怎么变灰的?今日Web要求:所有网页变成灰色。
  17. keytool生成私钥、公钥、证书详解
  18. 总结2021,互联网留下的6个记忆
  19. js中scroll滚动相关
  20. 494. 目标和 - 01背包中装满背包有几种方法的问题

热门文章

  1. Qt 之 打开exe程序
  2. 将hexo博客部署到阿里云服务器
  3. jdk官网下载,附带镜像站下载方式
  4. 编码修养系列---提升性能必学篇
  5. 有什么PDF阅读器?告诉你三个好用的PDF阅读软件
  6. list集合用stream流distinct去重失效问题
  7. Android集成FFmpeg并实现视频转码
  8. 华为路由器:清除配置
  9. 学习经验分享之八:EI检索查询
  10. 申报高新技术企业需要注意的问题