本文浅显的分析了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. 在VMware的虚拟机中克隆CentOS,在重启网卡的时候报错解决办法

    克隆虚拟机配置 1.修改:vi /etc/hosts 2.修改:vi /etc/sysconfig/network 3.重启生效:reboot或者init 6 如不重启可以输入:hostname  新 ...

  2. WIN10在loadrunner安装或path4插件安装时遇到的管理员阻止程序运行---解决方案(可用)

    方法1:关闭用户账户控制1.“win+x”进入控制面板,选择安全性与维护,在左侧更改windows smartscreen筛选器设置,选择"不执行任何操作",单击确定即可.2.“w ...

  3. easyui的datagrid改变单元格颜色

    另一种方法:https://www.cnblogs.com/raitorei/p/10395233.html easyui的datagrid改变整行颜色:https://www.cnblogs.com ...

  4. react项目的ant-design-mobile的使用

    现在测试一下ant-design-mobile的使用,引用一个Button 没有样式 这个问题是没有引入样式 解决方法有两种 这种方法自己弄不出来,然后用另外一种方法 引入样式: import 'an ...

  5. react项目的react-router-dom路由的使用

    现在测试一下react-router-dom路由的使用,首先在App.js这个文件搭配路由 import React, { Component } from 'react'; import {Link ...

  6. Go学习笔记:Win7+LiteIDE+Go+Beego 环境搭建

    安装过程比较简单 1.安装go语言环境: 2.安装git: 3.git bash      安装beego,输入“go get github.com/astaxie/beego”,等待一会儿,在D盘的 ...

  7. hdpi对应分辨率

    ldpi  QVGA (240×320) mdpi  HVGA (320×480) hdpi  WVGA (480×800),FWVGA (480×854) xhdpi  720P(1280*720) ...

  8. squid代理允许FTP访问设置

    # TAG: acl # Defining an Access List ============================= #Default: # acl all src all # #Re ...

  9. 3U - 算菜价

    妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐.现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵. Input 输入含有一些数据组,每组数据包括菜种( ...

  10. 锻造(forging)

    --九校联考24OI__D1T1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现--自己连一个史莱姆都打不过了. 勇 ...