本文浅显的分析了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. Linux 禁止普通用户su到root

    Linux账户权限管理上为了防止普通用户通过su切换到root用户,需要修改/etc/pam.d/su和/etc/login.defs两个配置文件. Step1:修改 /etc/pam.d/su文件 ...

  2. 题目--oil Deposits(油田) 基础DFS(深度搜索)

    上一次基本了解了下BFS,这次又找了个基本的DFS题目来试试水,DFS举个例子来说就是 一种从树的最左端开始一直搜索到最底端,然后回到原端再搜索另一个位置到最底端,也就是称为深度搜索的DFS--dep ...

  3. Python练习-迭代-2018.11.28

    #遍历list L=['a','b','c','d'] l=[] a=0 for n in L: l.insert(a,n) a=a+1 print(l) #遍历dict里的key,导出为list L ...

  4. vm ware虚拟机ping不通解决办法

    本人是linux菜鸟,在使用vm ware的时候,在多台电脑上安装了多个虚拟机,这多台电脑是同一网段的,并且能够互相ping通,但是vm ware下的虚拟机就无法ping通 通过自己的各种才是,发现在 ...

  5. 247. Strobogrammatic Number II输出所有对称数字

    [抄题]: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at u ...

  6. Head First Servlets & JSP 学习笔记 第六章 —— 会话状态

    MVC中的M(模型),通常就是一个普通的类,这个类里面的信息就是业务逻辑. 会话(Session) 我们可以使用一个HttpSession对象,来保存横跨多个请求的会话状态. HTTP协议使用的是无状 ...

  7. Android开发中同时存在多个ListView的处理

    在Android开发过程中,有的时候我们需要在一个页面中通过多个ListView展示不同的数据,让用户直观上感觉是一个ListView在变换着数据. 假设有两个ListView,listView1和L ...

  8. The best way to use Xtool X100 PAD2 for FEM programming

    Look here: XTOOL X100 PAD2 is new FEM programming. Possible to use Xtool X100 PAD2 for FEM programmi ...

  9. latex相关概念

    关于Latex,收到网友的鼓励,决定好好整理下相关的信息. 在初次使用相关的程序时,遇到很多迷惑的概念,下面这篇帖子汇总得很详细. 关于latex各种概念与理解 帖子中提到了三个概念,引擎,宏集(即下 ...

  10. boost--日期处理

    1.timer 不同于系统函数的timer()一般生成一个定时器,boost中的timer是一个计时器,以秒为单位,最小精度为毫秒,使用需要包含头文件"boost\timer.hpp&quo ...