mysql为啥建选不了普通索引

mysql为啥建选不了普通索引,第1张

mysql数据库索引是一种能够让mysql数据查询更加快速的数据结构,我们在新建数据库的时候,如果设置了某个字段的Primary key主键,那么数据库会默认为我们的主键字段创建一个唯一索引(Unique Index)的东西,所以你就不需要再为此字段创建mysql数据库索引了,当然了,如果你想设置别的字段索引,那么就要额外加入该字段的数据库索引了。

一:Mysql数据库索引的创建

1)如何为我们的mysql数据库添加索引呢?很简单,请看下面的创建mysql普通索引格式:

CREATE INDEX [index name] ON [table name]([column name]);

参数说明:NameDescription

index name索引名称

table name需要添加索引的表名称

column name需要添加索引的列名称

例如我们要创建一个索引,就可以使用如下的mysql命令运行即可:CREATE INDEX myindex ON mytable(aut_id);

2)唯一索引的创建,和mysql普通索引差不多,只需要在INDEX关键词前面加入UNIQUE关键词即可,mysql命令如下:CREATE UNIQUE INDEX myindex ON mytable(aut_id);

我们也可以使用USING BTREE关键字,B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度,mysql命令如下:CREATE UNIQUE INDEX myindex ON mytable(aut_id) USING BTREE;

二:查看mysql数据库索引

我们可以使用以下命令查询刚刚新建的mysql数据库索引,“from mytable”代表查询该数据库表里面有哪些索引,mysql命令如下:show index from mytable;

创建成功之后,会在“key_name”字段中显示刚刚创建的数据库索引名称,如图所示:

三:删除mysql数据库索引

我们也可以使用mysql命令删除某张表的索引,命令如下:drop index english on mytable

四:查询sql语句是否使用了mysql索引

我们上面常见好mysql数据库索引之后,如果想要知道我们在执行sql语句时是否使用了数据库索引,就要在sql语句前面加入“EXPLAIN”关键词,命令如下所示:EXPLAIN SELECT FROM `allword` where english='America';

如果使用到了我们创建的字段索引,就会看到如图所示的字段都不会是NULL空值,如下:

在有些情况下mysql索引会失效,也就是在执行到sql语句时没有使用到我们创建的数据库表字段索引,可能有以下这些情况:

1:使用了OR关键字查询

2:或者LOWER(),UPPER()函数,

3:还有一种就是使用了LIKE关键字查询,像(like '%XX'或者like '%XX%')这样的语句,但是像(like 'XX%')这种情况的mysql表索引是不会失效的。

文就是对这两种数据结构做简单的介绍。

1 B-Tree

B-Tree不是“B减树”,而是“B树”。

这里参考了严蔚敏《数据结构》对B-Tree的定义:

一棵m阶的B-Tree,或者为空树,或者满足下列特性:

1树中每个结点至多有m棵子树;

2若根结点不是叶子结点,则至少有两棵子树;

3除根节点之外的所有非终端结点至少有[m/2]棵子树;

4所有非终端结点中包含下列信息数据:

(n,A0,K1,A1,K2,A2……Kn,An)

其中,n为关键字的数目,K(i)为关键字,且K(i) < K(i+1), Ai为指向子树根结点的指针,且指针A(i-1)所指子树中所有结点的关键字均小于Ki,Ai所指子树中所有结点的关键字均大于Ki;

5所有叶子结点都出现在同一层次上;

下面通过一个例子解释一下B-Tree的查找过程。

这是一棵4阶的B-Tree,深度为4。

假如在该图中查找关键字47,首先从根结点开始,根据根结点指针t找到a结点,因为47大于 a 结点的关键字35,所以会去A1指针指向的 c结点继续寻找,因为 c的关键字 43 < 要查找的47 < c结点的关键字78,所以去 c结点A1指针指向的 g结点去寻找,结果在 g结点中找到了关键字47,查找成功。

2 B+Tree

不同的存储引擎可能使用不同的数据结构存储,InnoDB使用的是B+Tree;那什么是B+Tree呢?

B+Tree是应文件系统所需而出的一种B-Tree的变型树,一棵m阶的B+树和m阶的B-树的差异在于:

1有n棵子树的结点中含有n个关键字;

2所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字的记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接;

3所有的非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字;

还是通过一个例子来说明。

这个例子中,所有非终端结点仅含有子树中最大的关键字。

因为叶子节点本身依据关键字的大小自小而大顺序链接,所以可以从最小关键字起顺序查找。也可以从根结点开始,进行随机查找。

在B+树中随机差找和在B-树中类似,以上图为例。假设要查找关键字51,现在根节点中比较,发现51<59,因为这里使用的是非终端结点的关键字是子树中最大的关键字,所以进入最大值为59的子结点(15\44\59)中查找,同理,因为44<51<59,所以进入P3指向的结点(51\59)中查找,然后命中关键字51,因为此结点(51\59)是叶子结点,所以查找终止,该结点包含指向数据的指针。

3索引如何在B+Tree中组织数据存储

假设有如下表:

对于表中的每一行数据,索引中包含了last_name、first_name和dob列的值,下图展示索引是如何组织数据存储的:

索引对多个值进行排序的依据是定义索引时列的顺序。

(Allen Cuba 1960-01-01)结点左侧的指针指向[,Allen Cuba 1960-01-01)的叶子页,(Allen Cuba 1960-01-01)和(Astaire,Angelina,1980-03-04)之间的指针指向[Allen Cuba 1960-01-01,Astaire Angelina 1980-03-04)的叶子页,以此类推。总之,每个指针指向的结点中的最小值就是该指针左侧的的值。

这种存储结构也说明了在定义多个列组成的多列索引中,为什么需要把重复率最低的列放到最左侧,因为这会减少比较的次数,查找起来更加高效。

4索引为什么选用B树这种数据结构?

因为使用B树查找时,所用的磁盘IO *** 作次数比平衡二叉树更少,效率也更高。

为什么使用B树查找所用的磁盘IO *** 作次数比平衡二叉树更少?

大规模数据存储中,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的高度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。那么我们就需要减少树的高度以提高查找效率。而平衡多路查找树结构B树就满足这样的要求。B树的各种 *** 作能使B树保持较低的高度,从而达到有效减少磁盘IO *** 作次数。

事实上,在MySQL数据库中,诸多存储引擎使用的是B+树,即便其名字看上去是BTREE。

41 innodb的索引机制

先以innodb存储引擎为例,说明innodb引擎是如何利用B+树建立索引的

首先创建一张表:zodiac,并插入一些数据

对于innodb来说,只有一个数据文件,这个数据文件本身就是用B+树形式组织,B+树每个节点的关键字就是表的主键,因此innode的数据文件本身就是主索引文件,如下图所示,主索引中的叶子页(leaf page)包含了数据记录,但非叶子节点只包含了主键,术语“聚簇”表示数据行和相邻的键值紧凑地存储在一起,因此这种索引被称为聚簇索引,或聚集索引。

这种索引方式,可以提高数据访问的速度,因为索引和数据是保存在同一棵B树之中,从聚簇索引中获取数据通常比在非聚簇索引中要来得快。

所以可以说,innodb的数据文件是依靠主键组织起来的,这也就是为什么innodb引擎下创建的表,必须指定主键的原因,如果没有显式指定主键,innodb引擎仍然会对该表隐式地定义一个主键作为聚簇索引。

同样innodb的辅助索引,如下图所示,假设这些字符是按照生肖的顺序排列的(其实我也不知道具体怎么实现,不要在意这些细节,就是举个例子),其叶子节点中也包含了记录的主键,因此innodb引擎在查询辅助索引的时候会查询两次,首先通过辅助索引得到主键值,然后再查询主索引,略微有点啰嗦

主键:是唯一标示当前表里的那一列,用主键可以代替表里一条实体的内容,

如:你有一个名字,有你的住址,电话号码,籍贯,学位,政治面貌,等属性,

但唯一能够标示你的还是你的身份z号,因为别人有可能有跟你同样的名字,或者同样的住址,或者同样的的学位。。但身份z是唯一的。通过身份z,我完全知道你本人。

索引:就相当于你买了一部字典的目录,通过目录,可以找到你需要查找的内容。索引不是自动有的,在数据库中,必须根据表里的字段建立索引。

唯一:也是一种约束,将字段设置唯一约束后,该字段在表里的所有“记录”将是不同的,比如将学号设置为唯一,第一个学生,学号 00001;那么第二个学生 学号 可以是 00002或者00003 而不能设置为 00001,如果,设置为00001的话,数据库将报:字段违反唯一约束,这样做的目的是为了每个学生有不同的学号。

MyISAM、InnoDB、Heap(Memory)、NDB 貌似一般都是使用 InnoDB的,mysql的存储引擎包括:MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDBCluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。最常使用的2种存储引擎:1Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是frm(存储表定义)、MYD(MYData,存储数据)、MYI(MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。2InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。不知道是不是对你有帮助

以上就是关于mysql为啥建选不了普通索引全部的内容,包括:mysql为啥建选不了普通索引、mysql索引采用什么数据结构、mysql采用哪些索引,B树索引解释下等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10200289.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存