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

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

目录:

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

1.索引有哪几种?各种索引优缺点?

提及索引,第一个问题应该是索引有哪几种,各种索引有啥优缺点,针对这个问题去搜索资料,较全面及优质的资料见http://www.2cto.com/database/201501/368126.html;这里做一个简单汇总:

  • 按表类型分为:MyISAM表索引与INNODB表索引;按索引特征又分为唯一索引与全文索引、单列索引与多列索引、聚簇索引。

  • MyISAM表索引与INNODB表索引区别:

    1. 聚簇索引指索引中键值与表数据存储在一起,这里主要是INNODB表索引,显然索引与数据存在一起的好处就是数据获取效率高。
    2. 而MyISAM表索引与表数据是分开存储的,索引保存在"表名.MYI"文件内,而数据保存在"表名.MYD"文件内;
  • 其它注意点

    1. 另外一个重要的区别是MyISAM表不支持事务,INNODB表在每行数据中增加了DB_TRX_ID、db_roll_ptr、db_row_id三个值来支持事务。
    2. 唯一索引强调索引值必须唯一,比如主键;全文索引一般在CHAR、VARCHAR或TEXT列上创建,MyISAM表支持而INNODB表不支持,常见主要针对文本进行索引。
    3. 典型的应用场景区分: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,b,c)的使用问题?
  1. 首先要明白多列索引与联合索引区别
    参见http://www.infocool.net/kb/Mysql/201603/26364.html以文件字节进行了分析。
  1. 多个单列索引一个索引一棵树:

    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优化部分。

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. 重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化

    重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化 一:Mysql原理与慢查询 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...

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

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

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

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

  6. InnoDB 索引原理

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

  7. mysql myisam转innodb的2种方法

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

  8. MySQL的InnoDB索引原理详解

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

  9. MySQL的InnoDB索引原理详解 (转)

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

随机推荐

  1. javaweb开发.常用的第三方包

      序号 开发包名称 描述 1 dom4j-1.6.1.jar dom4j用于操作XML文件 2 jaxen-1.1-beta-6.jar 用于解析XPath表达式 3 commons-beanuti ...

  2. 防火墙/IDS测试工具Ftester

    防火墙/IDS测试工具Ftester FTester 全称Firewall Tester,是一个用来测试防火墙的过滤策略和入侵检测(IDS)能力的工具.这个工具主要是有两个perl的脚本组成: 1. ...

  3. 搭建RESTful API来使用Fabric Node SDK 开篇

    在Balance-Transfer中,有关于Node SDK比较完备的例子. SDK的官方文档在这里:https://fabric-sdk-node.github.io/ Balance-Transf ...

  4. maven 项目中没有src/test/java文件夹

    项目右键->buildPath configure Build Path->点击选项卡Libraries->选中JRE System Library->点击edit->选 ...

  5. 开启hadoop集群

    首先开启zookeeper zkServer.sh start start-all

  6. selenium实现淘宝的商品爬取

    一.问题 本次利用selenium自动化测试,完成对淘宝的爬取,这样可以避免一些反爬的措施,也是一种爬虫常用的手段.本次实战的难点: 1.如何利用selenium绕过淘宝的登录界面 2.获取淘宝的页面 ...

  7. c++WIN32获取syslistview行数

    #include "stdafx.h" #include <windows.h> #include <commctrl.h> #include <io ...

  8. python中global和nonlocal用法的详细说明

    一.global 1.global关键字用来在函数或其他局部作用域中使用全局变量.但是如果不修改全局变量也可以不使用global关键字.   gcount = 0 def global_test(): ...

  9. CCPC-2017-秦皇岛站

    10月25日 听说信用卡到了好兴奋,然而没有额度是啥情况啊qwq. 晚上坐飞机出发,成都-鄂尔多斯-石家庄-秦皇岛,队友吐槽鄂尔多斯到石家庄好近啊,然后过了一会儿我们因为石家庄大雾迫降在了济南.嘤嘤嘤 ...

  10. 01-jQuery的介绍

    1.为什么要使用jQuery 在用js写代码时,会遇到一些问题: window.onload 事件有事件覆盖的问题,因此只能写一个事件. 代码容错性差. 浏览器兼容性问题. 书写很繁琐,代码量多. 代 ...