Java数据库测试题十道(附答案)

CodeBlocks 的下载安装

  返回  

MySQL索引原理

2021/7/20 17:14:44 浏览:

1.索引类型

索引可以提升查询速度,会影响where查询,以及order by排序。
从索引存储结构划分:B Tree索引、Hash索引、FULLTEXT全文索引、R Tree索引
从应用层次划分:普通索引、唯一索引、主键索引、复合索引
从索引键值(字段)类型划分:主键索引、辅助索引(二级索引)
从数据存储和索引键值逻辑关系划分:聚集索引(聚簇索引)、非聚集索引(非聚簇索引)

1.1普通索引

这是最基本的索引类型,基于普通字段建立的索引,没有任何限制。
创建索引的方法如下:
CREATE INDEX <索引的名字> ON tablename(字段名); (单独建立索引)
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名); (修改表结构时加索引)
CREATE TABLE tablename([…],INDEX [索引的名字] (字段名)); (创建表时加索引)
删除索引的方法
drop index <索引的名字> on tablename
查询表中的索引信息
show index from tablename;

1.2唯一索引

与普通索引类似,不同的就是:索引字段的值必须唯一,但允许有空值。在创建或修改表时追加唯一约束,就会自动创建对应的唯一索引。
创建唯一索引的方法如下:
CREATE UNIQUE INDEX <索引的名字> ON tablename(字段名);
ALTER TABLE tablename ADD UNIQUE INDEX [索引的名字] (字段名);
CREATE TABLE tablename([…],UNIQUE [索引的名字] (字段名))

1.3主键索引

它是一种特殊的唯一索引,不允许有空值。在创建或修改表时追加主键约束即可,每个表只能有一个主键。
创建主键索引的方法如下
CREATE TABLE tablename ([…],PRIMARY KEY(字段名))
ALTER TABLE tablename ADD PRIMARY KEY(字段名)

1.4复合索引

单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上;用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。
索引同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引,设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效
创建组合索引的方法如下:
CREATE INDEX <索引的名字> ON tablename(字段名1,字段名2…);
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名1,字段名2…)
CREATE TABLE tablename([…],INDEX [索引的名字] (字段名1,字段名2…))
复合索引的使用注意事项
复合索引字段是有顺序的,在查询使用时要按照索引字段的顺序使用。例如select * from user where name=xx and age=xx ,匹配(name,age)组合索引,不匹配(age,name)。
何时使用复合索引,要根据where条件建索引,注意不要过多使用索引,过多使用会对更新操作效率有很大影响。
如果表已经建立了(col1,col2),就没有必要再单独建立(col1);如果现在有(col1)索引,如果查询需要col1和col2条件,可以建立(col1,col2)复合索引,对于查询有一定的提高。
联合索引IDX(字段A,字段B,字段C,字段D),当仅使用字段A查询时,索引IDX就会使用到;如果仅使用字段B或字段C或字段D查询,则索引IDX都不会用到。

1.5全文索引

查询操作在数据量比较少时,可以使用like模糊查询,但是对于大量的文本数据检索,效率低下。如果使用全文索引,查询速度会比like快很多倍。在MySQL5.6以前的版本,只有MyISAM存储引擎支持全文索引,从MySQL5.6之后开始MyISAM和InnoDB存储引擎均支持。
创建全文索引的方法如下:
CREATE FULLTEXT INDEX<索引的名字> ON tablename(字段名);
ALTER TABLE tablename ADD FULLTEXT [索引的名字] (字段名);
CREATE TABLE tablename([...], FULLTEXT KEY [索引的名字] (字段名));

和常用的like模糊查询不同,全文索引有自己的语法格式,使用match和against 关键字,比如

select * from user where mathc(name)against(‘aaa’);
全文索引必须在字符串、文本字段上建立。
全文索引字段值必须在最小字符和最大字符之间才会有效。(innodb:3-84,myisam:4-84)
全文索引字段值要进行切词处理,按syntax字符进行切割,例如b+aaa,切分成b和aaa
全文索引匹配查询,默认使用的时等值匹配,例如a匹配a,不会匹配ab,ac。如果想匹配可以在布尔模式下搜索a*
select * from user where mathc(name)against(‘a*’ in boolean mode);

全文索引的最小最大查询字符数

2.索引原理

MySQL官方对索引的定义:是存储引擎用于快速查找记录的一种数据结构。需要额外开辟空间和数据维护工作。
索引是物理数据页存储,在数据文件中(InnoDB,ibd‘文件),利用数据页(page)存储。
索引可以加快检索速度,但是同时也会降低增删改操作的速度,索引维护需要代价。
索引涉及的理论知识:二分查找法、Hash和B+Tree。

2.1二分查找法

二分查找法也叫作折半查找法,它是在有序数组中查找指定数据的搜索算法。它的优点是等值查询、范围查询性能优秀,缺点是更新数据,新增数据、删除数据维护成本高。
首先定位left和right两个指针
计算(left+right)/2
判断除2后索引位置值与目标值的大小比对
索引位置值大于目标值就-1,right移动;如果小于目标值就+1,left移动。

2.2Hash结构

Hash底层实现是由Hash表来实现的,是根据键值<key,value>存储数据的结构。非常适合根据key查找value值,也就是单个key查询,或者说等值查询。其结构如下所示:
在这里插入图片描述
从上面结构可以看出,Hash索引可以方便的提供等值查询,但是对于范围查询就需要全表扫描了。Hash索引在MySQL中Hash结构主要应用在Memory原生的Hash索引、InnoDB自适应哈希索引。

InnoDB提供的自适应哈希索引功能强大,接下来重点描述下InnoDB自适应哈希索引。

InnoDB自适应哈希索引是为了提升查询效率,InnoDB存储引擎会监控表上各个索引页的查询,当InnoDB注意到某些索引值访问非常频繁时,会在内存中基于B+Tree索引再创建一个哈希索引,使得内存中的B+Tree索引具备哈希索引的功能,即能快速定值访问频繁访问的索引页。

自适应哈希索引的建立使得InnoDB存储引擎能自动根据索引页访问的频率和模式自动地为某些热点页建立哈希索引来加速访问。另外InnoDB自适应哈希索引的功能,用户只能选择开启或关闭功能,无法进行人工干涉。

2.3B+Tree结构

MySQL数据库索引采用的是B+Tree结构,在B-Tree结构上做了优化改造。

B-Tree结构
索引值和data数据分布在整棵树结构中
每个节点可以存放多个索引值以及对应的data数据
树节点中的多个索引值从左到右升序排列
在这里插入图片描述
B树的搜索:从根节点开始,对节点内的索引值序列采用二分法查找,如果命中就结束查找。没有命中会进入子节点重复查找过程,直到所对应的节点指针为空或者已经是叶子节点了才结束。

B+Tree结构
在这里插入图片描述

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号