本文浅显的分析了MySQL索引的原理及针对主程面试的一些问题,对各种资料进行了分析总结,分享给大家,希望祝大家早上走上属于自己的"成金之路"。

学习知识最好的方式是带着问题去研究所获取的资料,分析所获取资料的优点和不足,然后归纳汇总资料,结合使用场景形成整体的知识脉络体系,本文行文依据各类问题展开,并附上具体的资料,引导大家走上属于自己的"成金之路"。

目录:
1.索引有哪几种?各种索引优缺点?
2.索引的结构及为什么使用这种结构?
3.INNODB表索引常见面试问题——"最左缀"及ID自增问题

1.索引有哪几种?各种索引优缺点?
  提及索引,第一个问题应该是索引有哪几种,各种索引有啥优缺点,针对这个问题去搜索资料,较全面及优质的资料见http://www.2cto.com/database/201501/368126.html;这里做一个简单汇总:
  按表类型分为:MyISAM表索引与INNODB表索引;按索引特征又分为唯一索引与全文索引、单列索引与多列索引、聚簇索引。
    MyISAM表索引与INNODB表索引区别:
      聚簇索引指索引中键值与表数据存储在一起,这里主要是INNODB表索引,显然索引与数据存在一起的好处就是数据获取效率高。
      而MyISAM表索引与表数据是分开存储的,索引保存在"表名.MYI"文件内,而数据保存在"表名.MYD"文件内;
    另外一个重要的区别是MyISAM表不支持事务,INNODB表在每行数据中增加了DB_TRX_ID、db_roll_ptr、db_row_id三个值来支持事务。

  唯一索引强调索引值必须唯一,比如主键;全文索引一般在CHAR、VARCHAR或TEXT列上创建,MyISAM表支持而INNODB表不支持,常见主要针对文本进行索引。

  典型的应用场景区分:MyISAM表索引在处理文本索引时更具优势,而INNODB表索引在其它类型上更具效率优势,同时MySQL高并发需要事务场景时,只能使用INNODB表。

2.索引的结构及为什么使用这种结构?
  索引的结构大家都都知道是B+Tree,那么第一个问题就是为什么要使用这种Tree,而不是RB-Tree?
  这点从磁盘读写上给出解释,磁盘顺序读写时才能达到其宣传的数值(fio可以进行简单的读写测试),因为随机读写,机械磁盘需要旋转及寻道时间,哪怕是ssd,随机读写也需要寻址时间;那么如果将索引tree构建的层数越低,使得key相近的数据都存在一起,伴随磁盘预读特性,能更进一步提高性能。
  那么使用B+Tree的关键就是Tree层数低(3层),有序的数据存储位置接近,结合磁盘顺序读写、OS预读写特性,使得能很快定位到数据;而使用RB-Tree时key值相近的数据会存储的较远,导致效率低下。
    另外的一个问题就是数据插入时,怎么来平衡树,详见http://taop.marchtea.com/03.02.html。
  同时就是为了提高存储效率,尽量较少进行Tree的平衡操作,通过让key尽量保持自增,这样新增的数据即可按顺序进行存储,而不会或少量对已经存储的数据进行变更。

3.INNODB表索引"最左缀"及ID自增问题
a."最左缀"问题即创建联合索引(a,b,c)的使用问题?
  首先要明白多列索引与联合索引区别
    参见http://www.infocool.net/kb/Mysql/201603/26364.html以文件字节进行了分析。
    多个单列索引一个索引一棵树:
      MyISAM联合索引时,因为Tree存储的是地址,故每个索引都能追踪到表数据地址;
      InnoDB表数据和索引一起构成B+Tree,这里假设a为Primary Key,InnoDB表数据与按Primary Key构成B+Tree,然后创建b(second-key)、c(third-key)时,根据的b、c两列的数据作为key构建索引,而索引中存储的数据为Primary-Key值,查询时先检查辅助索引获得Primary-Key,然后再根据Primary-Key获取数据
        故InnoDB主键建议为单调,且不宜过长。

  多列组成联合索引一棵树:
    假设a为主键,则以a先放,a相同的情况下按b的顺序放,然后b相同按照c的顺序放。
    那么"最左缀"问题就很容易解释清楚了,像(b,c)/(c)/(a,c),因为无法按照索引树的规则来进行索引,导致需要全局扫描;而(a)/(a,b)/(a,b,c)则能使用到索引。
      另外针对(a,c)如果b列的数据都是重复数据,比如星期数据,则可以将(a,c)转为(a,b in (monday, ..., sunday),c)进行索引。
      查询优化问题详见http://blog.codinglabs.org/articles/theory-of-mysql-index.html优化部分。

b.ID自增问题
  显然INNODB表索引需要ID自增效率更好,而为了保证高并发下安全,采取锁表,进行ID的自增,详见http://www.cnblogs.com/zhoujinyi/p/3433823.html
  另外锁表效率在超高并发下,肯定效率会受到影响,那么引入"预申请"机制来提高效率,即为每次不定的操作多申请几个ID,保证效率,但会导致不连续

希望祝大家早上走上属于自己的"成金之路",如果觉得不错,烦请不吝"推荐",助于传播。谢谢,转载请注明出处(百度搜 成金之路)。
也可将我没有涉及到的问题进行留言,然后我去搜集资料、整理更新。

深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点、主程面试常问问题详解的更多相关文章

  1. 深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点分析

    本文浅显的分析了MySQL索引的原理及针对主程面试的一些问题,对各种资料进行了分析总结,分享给大家,希望祝大家早上走上属于自己的"成金之路". 学习知识最好的方式是带着问题去研究所 ...

  2. MySQL系列(九)--InnoDB索引原理

    InnoDB在MySQL5.6版本后作为默认存储引擎,也是我们大部分场景要使用的,而InnoDB索引通过B+树实现,叫做B-tree索引.我们默认创建的 索引就是B-tree索引,所以理解B-tree ...

  3. 0614MySQL的InnoDB索引原理详解

    转自http://www.cnblogs.com/shijingxiang/articles/4743324.html MySQL的InnoDB索引原理详解 http://www.admin10000 ...

  4. 优化、分析Mysql表读写、索引等操作的sql语句效率优化问题

    为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主 ...

  5. MyISAM 和 InnoDB 索引的区别

      阅读目录 一 MyISAM索引实现 二 InnoDB索引实现 三 InnoDB索引和MyISAM索引的区别 回到顶部 一 MyISAM索引实现 1. 主键索引 MyISAM引擎使用B+树作为索引结 ...

  6. InnoDB 索引原理

    InnoDB索引原理 索引能够提高访问的速率 B+树索引(最为常用和最为有效).全文索引.哈希索引. 数据库中的B+树索引可以分为聚集索引和辅助索引,但是不管是聚集还是辅助的索引,其内部都是B+树,是 ...

  7. mysql myisam转innodb的2种方法

      mysql myisam转innodb的2种方法 mysql中的myisam和innodb有什么区别.一个好比便利店,一个好比大型购物中心,他们是为了适应不同的场合而存在的.当流量比较小,我们可以 ...

  8. kafka原理和实践(五)spring-kafka配置详解

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  9. MySQL的InnoDB索引原理详解

    摘要 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本篇 ...

随机推荐

  1. 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!

    一.写在前面 前几天也是分享了一些学习必备干货(还没关注的,赶紧入坑:传送门),也好久没有与大家探讨技术方案了,心里也是挺痒痒的,这不,一有点闲暇之时,就迫不及待把最近测出来的坑分享给大家. 提起An ...

  2. Android Studio中.9.png文件出错问题

    昨天使用别人的.9.png图片放在自己的android studio工程下使用,出现如下错误: :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DA ...

  3. ionic-cordova 支付宝支付插件cordova-plugin-alipay-v2使用篇

    支付宝WS_APP_PAY_SDK_BASE_2.0 <APP支付> 支付宝的cordova插件其实在github上已经有很多了,但是都已经是以前的版本了.在2016年11月的时候支付宝进 ...

  4. linux中的软连接和硬连接

    1. 创建软连接的方法 ln -s /path/to/original /path/to/linkName 当我们对软连接文件进行修改后,对应的修改也会反映到原始的文件(反之亦然). 当我们删除软连接 ...

  5. Hibernate基本原理

    一.Hibernate是对JDBC进一步封装 原来没有使用Hiberante做持久层开发时,存在很多冗余,如:各种JDBC语句,connection的管理,所以出现了Hibernate把JDBC封装了 ...

  6. asp.net core mvc剖析:mvc执行过程(一)

    前面介绍了路由的过程,我们再来看下MvcRouteHandler的代码: public Task RouteAsync(RouteContext context) { ...... //根据路由信息查 ...

  7. Omi教程-生命周期和事件处理

    生命周期 名称 含义 时机 constructor 构造函数 new的时候 install 初始化安装,这可以拿到用户传进的data进行处理 实例化 installed 安装完成,HTML已经插入页面 ...

  8. Java集合框架之三:HashMap源码解析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集合模型我们有必要弄清楚它的使用方法和它底层的实 ...

  9. 第十七篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示下)

    前些时候用换了工作,本来是用的前端框架是easyui,后面用的是bootstrap.对于我来说虽然不是新东西,因为原来毕业时候用过一段时间,也不懂什么插件的开发,现在用过easyui后觉得easyui ...

  10. JS入门(一)

    在学js之前,我们应该先清楚js是什么,js全称JavaScript.是一门基于对象和事件的,有安全性的脚本语言.所谓脚本语言,就是一行一行执行的,就像剧本一样,一句句的往下读.而对象和事件,则是js ...