mysql索引学习⼀、索引类型
1、唯⼀索引(主键)
建表语句:
CREATE TABLE `person` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
2、普通索引
建表语句:
CREATE TABLE `person` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY (`NAME`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
添加索引:
CREATE INDEX `NAME` ON person(NAME)
3、全⽂索引
建表语句:
CREATE TABLE `person` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) DEFAULT NULL,
mysql语句分类`INTRODUCE` varchar(100),
PRIMARY KEY (`ID`),
KEY (`NAME`),
FULLTEXT KEY (`INTRODUCE`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
添加索引:
CREATE FULLTEXT INDEX `INTRODUCE` ON person(INTRODUCE);
4、组合索引
建表语句:
CREATE TABLE `person` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) DEFAULT NULL,
`INTRODUCE` varchar(100) DEFAULT NULL,
`AGE` int(2) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `NAME` (`NAME`) USING BTREE,
KEY `NAME_AGE` (`NAME`,`AGE`) USING BTREE,
FULLTEXT KEY `INTRODUCE` (`INTRODUCE`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
添加索引:
CREATE INDEX `NAME_AGE` ON person(NAME,AGE)
⼆、索引原理
1、数据结构
学习索引原理之前,先了解⼀些概念:BTREE、B-TREE、B+TREE、B*TREE:
1)BTREE
BTREE即为⼆叉搜索树(⼆叉查询树等),基本结构:
所有⾮叶⼦结点⾄多拥有两个⼉⼦(Left和Right);
所有结点存储⼀个关键字;
⾮叶⼦结点的左指针指向⼩于其关键字的⼦树,右指针指向⼤于其关键字的⼦树;
2)B-TREE
B-TREE是⼀种多路搜索树(并不是⼆叉的),基本结构(D=3):
D为⼤于1的⼀个正整数,称为B-Tree的度;
H为⼀个正整数,称为B-Tree的⾼度;
根结点的key数为[2, D];
每个⾮叶⼦结点最多只有D个key;且D>2;
每个叶⼦节点最少包含⼀个key,最多包含2D-1个key,叶节点的指针均为null
指针数等于key数+1
它的特性是关键字集合分布在整颗树中,任何⼀个关键字出现且只出现在⼀个结点中,这样搜索有可能在⾮叶⼦结点结束。3)B+TREE
B+树是B-树的变体,也是⼀种多路搜索树,基本结构:
其定义基本与B-TREE相同,除了⾮叶⼦结点的⼦树指针与关键字个数相同;
它的特性是所有关键字都出现在叶⼦结点的链表中(稠密索引),且链表中的关键字恰好是有序的,索引不可能在⾮叶⼦结点命中。
4)B*TREE
是B+树的变体,在B+树的⾮根和⾮叶⼦结点再增加指向兄弟的指针。
java进度条如何在for使用2、索引原理
MySQL官⽅对索引的定义为:索引(Index)是帮助MySQL⾼效获取数据的数据结构。也就是说:索引是⼀种数据结构。
1)MyISAM的索引
MyISAM引擎使⽤B+Tree作为索引结构,叶结点的data域存放的是数据记录的地址,所以说MyISAM的索引⽂件仅仅保存数据记录的地址,它的数据和索引⽂件是分开的。在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯⼀的,⽽辅助索引的key可以重复。
因此,MyISAM中索引检索的算法为⾸先按照B+Tree搜索算法搜索索引,取出地址值,读取相应数据记录,⽽地址值不是按照索引顺序分布的,MyISAM的索引⽅式也叫做⾮聚集索引。
css库有哪些2)InnoDB索引
虽然InnoDB也使⽤B+Tree作为索引结构,但具体实现⽅式却与MyISAM截然不同。第⼀个重⼤区别是InnoDB的数据⽂件本⾝就是索引⽂件,这棵树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据⽂件本⾝就是主索引。第⼆个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值⽽不是地址。换句话说,InnoDB的所有辅助索引都引
⽤主键作为data域。
InnoDB的这种索引叫做聚集索引,因为InnoDB的数据⽂件本⾝要按主键聚集,所以InnoDB要求表必须有主键。
3)⾮聚集索引和聚集索引
从上⾯了解,聚集索引就像字典中的拼⾳搜索页,拼⾳的顺序与页码的顺序⼀直;⾮聚集索引就像字典中的偏旁部⾸搜索页,偏旁部⾸的顺序并不与页码顺序对应。所以这也就应对了MyISAM和InnoDB存储引擎的优缺点,InnoDB可以直接根据索引迅速到硬盘上存储位置进⾏INSERT或UPDATE,所以说InnoDB更适⽤⼤量的存储和更新操作。
三、执⾏计划
fillrect()四个参数分别代表什么执⾏计划就是SQL在数据库中执⾏时的表现情况,通常⽤于SQL的性能分析、优化等场景,Mysql通过explain命令输出执⾏计划,对要执⾏的查询进⾏分析。
1、Mysql逻辑架构
客户端
如连接处理、授权认证、安全等功能。
核⼼服务
mysql⼤多数核⼼服务均在这⼀层,包括查询解析、分析、优化、缓存、内置函数(时间、数学、加密等),所有的跨存储引擎的功能也在这⼀层,如存储过程、触发器、视图等。
存储引擎
负责mysql中的数据存储和读取,中间的服务通过api与存储引擎通信,这些api屏蔽了不同存储引擎间的差异。
2、查询过程
instruct固定搭配
查询过程如下:
客户端将查询发送到mysql服务器
服务器先检查查询缓存,如果命中,⽴即返回缓存中的结果;否则进⼊下⼀阶段
服务器对SQL进⾏解析、预处理,再由优化器⽣成对象的执⾏计划
MySQL根据优化器⽣成的执⾏计划,调⽤存储引擎API来执⾏查询
服务器将结果返回给客户端,同时缓存查询结果
四、EXPLAIN
输出字段解释:
1、id
select查询序列号,id相同,执⾏顺序由上⾄下;id不同,id值越⼤优先级越⾼,越先被执⾏。
2、select_type
查询数据的操作类型:
simple
简单查询,不包含⼦查询或union
primary
包含复杂的⾃查询,最外层查询标记为该值
subquery
在select或where⾥⾯包含⼦查询,被标记为该值
derived
在from列表中包含的⼦查询被标记为该值,mysql会递归执⾏这些⼦查询,把结果放⼊临时表中
union
若第⼆个select出现union之后,则被标记为该值;若union包含在from的⼦查询中,外层select被标记为derived
vim编辑器如何退出union result
从union表获取结果的select
3、table
显⽰该杭数据是关于哪张表
4、partitions
匹配的分区
5、type
表的连接类型,其值、性能由⾼到低排序,system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论