深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点、主程面试常问问题详解
本文浅显的分析了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索引原理、优缺点、主程面试常问问题详解的更多相关文章
- 深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点分析
本文浅显的分析了MySQL索引的原理及针对主程面试的一些问题,对各种资料进行了分析总结,分享给大家,希望祝大家早上走上属于自己的"成金之路". 学习知识最好的方式是带着问题去研究所 ...
- MySQL系列(九)--InnoDB索引原理
InnoDB在MySQL5.6版本后作为默认存储引擎,也是我们大部分场景要使用的,而InnoDB索引通过B+树实现,叫做B-tree索引.我们默认创建的 索引就是B-tree索引,所以理解B-tree ...
- 0614MySQL的InnoDB索引原理详解
转自http://www.cnblogs.com/shijingxiang/articles/4743324.html MySQL的InnoDB索引原理详解 http://www.admin10000 ...
- 优化、分析Mysql表读写、索引等操作的sql语句效率优化问题
为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主 ...
- MyISAM 和 InnoDB 索引的区别
阅读目录 一 MyISAM索引实现 二 InnoDB索引实现 三 InnoDB索引和MyISAM索引的区别 回到顶部 一 MyISAM索引实现 1. 主键索引 MyISAM引擎使用B+树作为索引结 ...
- InnoDB 索引原理
InnoDB索引原理 索引能够提高访问的速率 B+树索引(最为常用和最为有效).全文索引.哈希索引. 数据库中的B+树索引可以分为聚集索引和辅助索引,但是不管是聚集还是辅助的索引,其内部都是B+树,是 ...
- mysql myisam转innodb的2种方法
mysql myisam转innodb的2种方法 mysql中的myisam和innodb有什么区别.一个好比便利店,一个好比大型购物中心,他们是为了适应不同的场合而存在的.当流量比较小,我们可以 ...
- kafka原理和实践(五)spring-kafka配置详解
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- MySQL的InnoDB索引原理详解
摘要 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本篇 ...
随机推荐
- Python学习--17 进程和线程
线程是最小的执行单元,而进程由至少一个线程组成.如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间. 进程 fork调用 通过fork()系统调用,就可以生成一个子进程 ...
- .Net下的分库分表帮助类——用分库的思想来分表
简介 在大型项目中,我们会遇到分表分库的情景. 分库,将不同模块对应的表拆分到对应的数据库下,其实伴随着公司内分布式系统的出现,这个过程也是自然而然就发生了,对应商品模块和用户模块, ...
- 改变radio默认样式
改变radio默认样式,代码如下: <!doctype html> <html> <head> <meta charset="UTF-8" ...
- ACM 海贼王之伟大航路(深搜剪枝)
"我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...
- Codeforces Round #372 +#373 部分题解
用了两场比赛上Div 1感觉自己好腊鸡的说...以下是这两场比赛的部分题解(不得不说有个黄学长来抱大腿还是非常爽的) Round #372 : Div 2 A:Crazy Computer 题意:给定 ...
- 剖析Asp.Net Web API中HttpController的激活
在Asp.Net Web API中,请求的目标是定义在某个HttpController中的某个Action方法.当请求经过Asp.Net Web API消息处理管道到达管道"龙尾" ...
- HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(二)
HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一) 下面来查看其他对保存HSTS信息的enabled_sts_hosts ...
- Linux SVN安装部署
系统:centos6.3 svn: subversion-1.6.1 apache: httpd-2.2.29 //创建svn路径 [root@localhost /]# mkdir svn [roo ...
- 微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)
网上火热的“微软.NET年芳15”文章,我也得写点什么嘛,毕竟我还是现任的微软MVP. 摘录网上的“.NET 15周年”信息如下: 微软的 .NET 框架本周迎来了 15 岁生日..NET 的第一个版 ...
- thinkphp join加别名
//此段代码在某个Model里面$tbpre = $this->tableprefix;$Aaa = M('aaa');$Aaa->table(array("{$tbpre}aa ...