| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL-索引 -> 正文阅读 |
|
[大数据]MySQL-索引 |
目录 1、索引概述????????MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如图所示: 2、索引的优势与劣势优势: (1)类似于书记的目录索引,提高数据检索的效率,降低数据库的IO成本; (2)通过索引列对数据的排序,降低数据排序的成本,降低CPU的消耗。 劣势: (1)实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引也是要占用空间的; (2)虽然索引大大提高了查询效率,同时也降低更新表的速度,如对表进行INSERT、 UPDATE、DELETE。因为更新表的时候,MySQL不仅要保存数据,还要更新索引结构。 3、索引结构?????? 索引是在MySQL的存储引擎中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。MySQL目前提供了以下四种索引: (1)BTREE索引:最常见的索引类型,大部分索引都支持B树索引; (2)HASH索引:只有Memory引擎支持; (3)R-TREE索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型; (4)FULL-TEXT(全文索引):全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从MySQL5.6版本开始支持全文索引。 3.1、B-TREE索引B-TREE又叫多路平衡搜索树,一颗m叉的B-TREE特性如下: (1)树中每个节点最多包含m个孩子; (2)除根节点与叶子节点外,每个节点至少有[ceil(m/2)]个孩子; (3)若根节点不是叶子节点,则至少有两个孩子; (4)所有的叶子节点都同一层; (5)每个非叶子节点由n个key与n+1个指针组成,其中[ceil(m/2)-1] <= n <= m-1。 注:ceil-向上取整 ??? 以五叉BTREE为例,key的数量根据公式[ceil(m/2)-1] <= n <= m-1推导得知:n的取值范围是[2,4]。当n>4时,中间节点分裂到父节点,两边的节点分裂成两个棵树。例如:插入C N G A H E K Q M F W L T Z D P R X Y S数据为例,演变过程如下: ①插入前四个字母C N G A: 注:空方格代表指针。 ②插入H,n>4,中间元素G字母向上分裂到新的节点 G分裂得到: ③插入E、K、Q,不需分裂,直接插入: ④插入M,中间元素M字母向上分裂到父节点G ????????M分裂到父节点,两边变成两个子树: ??? ⑤插入F、W、L、T,不需分裂,直接插入: ⑥插入Z,中间元素T向上分裂: ⑦插入D,中间元素D向上分裂到父结点中,然后插入P、R、X、Y不需分裂: ?? ⑧最后插入S,NPQR节点n>5,中间结点Q向上分裂,但分裂之后DGMT的n>5,中间节点M接续向上分裂,总共分裂两次。 最终得到: 3.2、B+TREE结构B+TREE是BTREE的变种,B+TREE与BTREE的区别为: (1)n叉B+TREE最多含有n个key,而BTREE最多含有n-1个key; (2)B+TREE的叶子节点保存所有的key信息,根据key大小顺序排列; (3)所有的非叶子节点都可以看作是key的索引部分,起到索引的作用。 ????? 由于B+TREE只有叶子节点保存key信息,查询任何key都要从root走到叶子,所以B+TREE的查询效率更加稳定。 3.3、MySQL中的B+TREE结构??? MySQL中的B+TREE索引结构对B+TREE进行了优化。在原B+TREE的基础上增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+TREE,提高了区间访问的性能。如图所示: 4、索引分类(1)主键索引:索引为主键; (2)单值索引:即一个索引只包含单个列,一个表可以有多个单列索引; (3)唯一索引:索引列的值必须唯一,但允许有空值(主键不能为空); (4)复合索引:一个索引包含多个列。 5、索引语法5.1创建索引??? 两种方式:①在创建表的时候添加索引②表建好之后创建索引。 ·CREATE 索引类型 INDEX 索引名称USING 索引结构 ON? 表名(索引列名) 如:CREATE INDEX indexByID USING HASH ON teacher(tno) ??? 索引类型和索引结构均可省略,索引结构默认为BTREE。 注意:MySQL是否支持手动创建索引,应该考虑到具体的存储引擎。 MySQL官方说了,不支持手动管理HASH索引,但是支持InnoDB查询时自适应成对应的HASH索引,用于优化。 5.2查看索引·SHOW INDEX FROM 表名 例如:SHOW INDEX FROM teacher 5.3删除索引·DROP INDEX 索引名 ON 表名 例如:DROP INDEX indexByID ON teacher 5.4通过修改表来建立索引·ALTER TABLE 表名 ADD 索引类型 索引名(索引列) 例如: ??? 6、索引的设计原则??? 索引的设计可以遵循一些已有的原则,创建索引的时候尽量考虑符合这些原则,便于提升索引的使用效率,更高效地使用索引。 (1)对查询频次较高,且数据量比较大的表建立索引(数据在2000条以上); (2)索引字段的选择:最佳候选列应当从where子句的条件中提取,如果where子句中的组合比较多,那么应当挑选最常用、过滤效果最好的列来组合; (3)尽量使用唯一索引,区分度越高,索引效率越高; (4)索引可以有效地提升查询数据的效率,但索引数量不是越多越好。索引越多,维护索引的代价越大。对于插入、更新、删除等DML操作比较频繁的表来说,会引入相当高的维护代价,进而降低了DML操作的效率,增加相应维护索引的时间消耗。另外,索引过多的话,MySQL也会有选择困难症,虽然最后会选择一个可用的所用,但选择的消耗也必然增大。 (5)使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O也可以提升总体的访问效率。加入构成索引的字段总长度比较短,那么在给定大小的存储块内可以存储更多的索引值,相应的可以有效地提升MySQL访问索引的I/O效率; (6)利用最左前缀,N个列组合而成的组合索引,相当于是创建了N个索引。如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 20:46:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |