这是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的索引实现后,就非常easy明确为什么不建议使用过长的字段作为主键,由于全部辅助索引都引用主索引。过长的主索引会令辅助索引变得过大。再比如,用非单调的字段作为主键在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. 2014阿里实习生面试题——MySQL如何实现索引的

    这是2014阿里实习生北京站二面的一道试题: 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比如MyISAM和InnoDB存储引擎. MyISAM索引实现: MyI ...

  2. 诺基亚(Microsoft Devices Group)2014暑期实习生笔试题知识点

    总结一下Microsoft Devices Group的软件类笔试题,全部笔试题分两份试卷,逻辑题一份和软件測试题一份,仅仅总结技术题喽~题目全英文,仅仅包括选择题和填空题.选择题居多.分单选和多选. ...

  3. 面试题:MySQL性能调优——索引详解与索引的优化 没用

    ——索引优化,可以说是数据库相关优化.理解尤其是查询优化中最常用的优化手段之一.所以,只有深入索引的实现原理.存储方式.不同索引间区别,才能设计或使用最优的索引,最大幅度的提升查询效率! 一.BTre ...

  4. BAT及各大互联网公司2014前端笔试面试题--Html,Css篇

    很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正 ...

  5. BAT及各大互联网公司2014前端笔试面试题--JavaScript篇

    很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确, ...

  6. 面试题2:BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇

    BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇 Html篇: 1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? IE: trident内核 Firefox:gecko内 ...

  7. 阿里云vps上mysql挂掉的解决办法

    阿里云vps上mysql挂掉的解决办法 4条回复 用阿里云的vps用作blog服务器,系统很稳定,已经100多天一直运行正常,大概从上个月开始发现blog的mysql会有时挂掉,会收到短信通知.之前没 ...

  8. [分享]运维分享一一阿里云linux系统mysql密码修改脚本

    [分享]运维分享一一阿里云linux系统mysql密码修改脚本       大象吃豆子 级别: 小白 发帖 12 云币 27 加关注 写私信   只看楼主 更多操作楼主  发表于: 2014-09-3 ...

  9. 【转】BAT及各大互联网公司2014前端笔试面试题:JavaScript篇

    原文转自:http://blog.jobbole.com/78738/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是 ...

随机推荐

  1. 无尽的循环ViewPager

    现在的情况 不改变的源代码,什么时候ViewPager滑动到最后item的时候,他就无法再往右滑动:当ViewPager滑动到第一个item的时候,他也无法再往前滑动. (以上全是废话) 设想 我们能 ...

  2. openstack临时存储后端

    声明: 本博客欢迎转发.但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! 眼下openstack提供了 ...

  3. cocos2d-x删除本地存储的文件UserDefault.xml方法——白费

    许多其他的精彩分享:http://blog.csdn.net/u010229677 首先获取UserDefault的存储位置.然后remove就可以: remove( UserDefault::get ...

  4. OpenWrt wireless通过配置uci生效

    [转载请注明出处:钱正柱 http://blog.csdn.net/qianguozheng/article/details/24412673] 配置无线 vi /etc/config/wireles ...

  5. Hibernate在关于一对多,多对一双向关联映射

    [Hibernate]之关于一对多,多对一双向关联映射 因为一对多.和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name=&qu ...

  6. Java 理论与实践: 正确使用 Volatile 变量(转)

    Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少, ...

  7. Java并发编程之ConcurrentHashMap(转)

    ConcurrentHashMap ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法.Concurrent ...

  8. hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  9. SpringMVC使用FileUpload上传文件

    进口FileUpload和common-io的Jar包 注意:1.Struts2其它方法需要使用的:struts2过滤,将改变reqeust类型,由HttpServletRequest成为MultiP ...

  10. Android重力加速度传感器数据去噪

    public void onSensorChanged(SensorEvent event) { final float alpha = 0.8; gravity[0] = alpha * gravi ...