作家
登录

MySQL:数据结构及算法原理

作者: 来源: 2017-05-11 13:40:27 阅读 我要评论

图8

这里设表一共有三列,假设我们以Col1为主键,则图8是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和帮助索引(Secondary key)在构造膳绫腔有任何差别,只是主索引请求key是独一的,而帮助索引的key可以反复。如不雅我们在Col2上建立一个帮助索引,则此索引的构造如下图所示:

图9

同样也是一颗B+Tree,data域保存数据记录的地址。是以,MyISAM中索引检索的算法为起首按照B+Tree搜刮算法搜刮索引,如不雅指定的Key存在,则掏出其data域的值,然后以data域的值为地址,攫取响应数据记录。

MyISAM的索引方法也叫做“非集合”的,之所以这么称呼是为了与InnoDB的集合索引区分。

InnoDB索引实现

7. 一个节点中的key大年夜左到右非递减分列。

固然InnoDB也应用B+Tree作为索引构造,但具体实现方法却竽暌闺MyISAM截然不合。

第一个重大年夜差别是InnoDB的数据文件本身就是索引文件。大年夜上文知道,MyISAM索引文件和数据文件是分别的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引构造,这棵树的叶节点data域保存了完全的数据记录。这个索引的key是数据表的主键,是以InnoDB表数据文件本身就是主索引。

图10

图10是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完全的数据记录。这种索引叫做集合索引。因为InnoDB的数据文件本身要按主键集合,所以InnoDB请求表必须有主键(MyISAM可以没有),如不雅没有显式指定,则MySQL体系会主动选择一个可以独一标识数据记录的列作为主键,如不雅不存在这种列,则MySQL主动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

这里以英文字符的ASCII码作为比较准则。集合索引这种实现方法使得按主键的搜刮十分高效,然则帮助索引搜刮须要检索两陋俗引:起首检索帮助索引获得主键,然后用主键到主索引中检索获得记录。

懂得不合存储引擎的索引实现方法对于精确应用和优化索引都异常有赞助,例如知道了InnoDB的索引实现后,就很轻易明白为什么不建议应用过长的字段作为主键,因为所有帮助索引都引用主索引,过长的主索引会令帮助索引变得过大年夜。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了保持B+Tree的特点而频繁的决裂调剂,十分低效,而应用自增字段作为主键则是一个很好的选择。

下一章将具体评论辩论这些与索引有关的优化策略。

索引应用策略及优化

MySQL的优化重要分为构造优化(Scheme optimization)和萌芽优化(Query optimization)。本章评论辩论的高机能索引策略重要属于构造优化范畴。本章的内容完全基于上文的理论基本,实际上一旦懂得了索引背后的机制,那么选择高机能的策略就变成了纯粹的推理,并且可以懂得这些策略背后的逻辑。

为了评论辩论索引策略,须要一个数据量不算小的数据库作为示例。本文选用MySQL官方文档中供给的示例数据库之一:employees。这个数据库关系复杂度适中,且数据量较大年夜。下图是这个数据库的E-R关系图(引用自MySQL官方手册):

可以看到索引对第二个范围索引力所不及。这里特别要解释MySQL一个有意思的处所,那就是仅用explain可能无法区分范围索引和多值匹配,因为在type中这两者都显示为range。同时,用了“between”并不料味着就是范围萌芽,例如下面的萌芽:

图12

MySQL官方文档中关于此数据库的页面为http://dev.mysql.com/doc/employee/en/employee.html。琅绫擎具体介绍了此数据库,并供给了下载地址和导入办法,如不雅有兴趣导入此数据库到本身的MySQL可以参考文中内容。

高效应用索引的重要前提是知道什么样的萌芽会应用到索引,这个问题和B+Tree中的“最左前缀道理”有关,下面经由过程例子解释最左前缀道理。

这里先说一下结合索引的概念。在上文中,我们都是假设索引只引用了单个的列,实际上,MySQL中的索引可以以必定次序引用多个列,这种索引叫做结合索引,一般的,一个结合索引是一个有序元组<a1, a2, …, an>,个中各个元素均为数据表的一列,实际上要严格定义索引须要用到关系代数,然则这里我不想评论辩论太多关系代数的话题,因为那样会显得很逝世板,所以这里就不再做严格定义。别的,单列索引可以算作结合索引元素数为1的特例。

以employees.titles表为例,下面先查看其上都有哪些索引:

大年夜结不雅中可以到titles表的主索引为<emp_no, title, from_date>,还有一个帮助索引<emp_no>。为了避免多个索引使工作变复杂(MySQL的SQL优化器在多索引时行动比较复杂),这里我们将帮助索引drop掉落:

ALTER TABLE employees.titles DROP INDEX emp_no;

如许就可以专心分析索引PRIMARY的行动了。

情况一:全列匹配。


  推荐阅读

  华为携手石化盈科共推智能制造平台 给石化行业“减负增效”

【51CTO.com原创稿件】前不久,华为与石化盈科隆重推出了两边深度合作后首个重要>>>详细阅读


本文标题:MySQL:数据结构及算法原理

地址:http://www.17bianji.com/lsqh/35159.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)