MySQL中索引详解

 2024-02-02 05:02:44  阅读 0

1.什么是索引? 为什么要索引?

索引用于快速查找列中具有特定值的行。 如果不使用索引,MySQL 必须从第一条记录开始读取整个表,直到找到相关行。 表越大,查询数据所需的时间就越长。 时间越长,如果表中查询的列上有索引,MySQL就可以快速到达某个位置去搜索数据文件,而不必查看所有数据,这样会节省一个时间。很多时间。

例如:有一张表,有2W条记录,记录了2W条个人信息。 有一个“电话”字段记录每个人的电话号码。 现在我想查询电话号码为xxxx的人的信息。

如果没有索引,那么就会逐条遍历表中的第一条记录,直到找到信息为止。

如果有索引的话,Phone字段会按照一定的方法进行存储,这样在查询这个字段的信息时,就可以快速找到对应的数据,而不需要遍历2W条数据。 MySQL中有两种索引存储类型:BTREE和HASH。 也就是说用一棵树或者Hash值来存储字段。 要详细知道如何找到它,你需要了解算法。 我们现在只需要知道索引的作用以及它的作用是什么。

2. MySQL中索引的优缺点及使用原则

优势:

1、MySql所有列类型(字段类型)都可以建立索引,即可以为任意字段设置索引

2.大大加快数据查询速度

缺点:

1、创建和维护索引需要时间,并且随着数据量的增加,花费的时间也会增加。

2.索引也需要占用空间。 我们知道数据表中的数据也会有一个最大在线设置。 如果我们有大量索引,索引文件可能比数据文件更快达到在线值。

3、在表中增加、删除、修改数据时,也需要动态维护索引,降低了数据维护速度。

使用原则:

通过上面提到的优缺点,我们应该可以知道,为每个字段设置一个索引是不够的,也不是索引越多越好,而是需要合理使用。

1.避免在频繁更新的表上使用过多的索引,并在查询频繁使用的字段上创建索引。

2.对于数据量较小的表最好不要使用索引,因为由于数据量较小,查询所有数据所花费的时间可能比遍历索引要少,并且索引可能不会产生优化影响。

3. 不要在公共值较少的列(字段)上创建索引。 例如,学生表的“性别”字段只有两个不同的值:男和女。 相反,如果一个字段中有很多不同的值,则可以创建索引。

上述所说的事情只是非常片面的。 索引肯定还有很多其他的优点或缺点,以及使用原则。 首先你应该基本了解索引,然后当你以后实际使用它时,你会逐渐知道其他功能。 注意,学习这篇文章的时候,首先知道什么是索引,它有什么作用,它有什么作用,为什么需要它等等,这一点非常重要。如果你不知道,就再看一遍上面写的文字,并仔细观察它。 理解。 一个表中可以创建多个索引,这些索引会存储在一个索引文件中(专门用来存储索引的地方)

三、指标分类

注意:索引是在存储引擎中实现的,这意味着不同的存储引擎会使用不同的索引。

而存储引擎:仅支持BTREE索引,即默认使用BTREE,无法替换。

/HEAP存储引擎:支持HASH和BTREE索引

索引分为四类:单列索引(普通索引、唯一索引、主键索引)、组合索引、全文索引、空间索引、

1.1. 单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。 不要在这里感到困惑。

1.1.1. 普通指数:

MySQL对基本索引类型没有限制。 定义索引的列中允许插入重复值和空值,纯粹是为了更快地查询数据。

1.1.2. 唯一索引:

索引列中的值必须是唯一的,但允许空值,

1.1.3. 主键索引:

它是一种特殊的唯一索引,不允许空值。

1.2. 综合指数

对表中多个字段组合创建的索引,只有在查询条件中使用这些字段的左字段时才会使用。 使用组合索引时,遵循的是最左边的前缀集。如果你还不明白这一点,我稍后会通过示例详细解释。

1.3. 全文索引

全文索引只能在引擎上使用。 全文索引只能用于CHAR、TEXT类型字段。 介绍了要求以及什么是全文索引。 就是在一堆文本等中使用某个关键字,就可以找到这个字段所属的记录行。 比如“你是个坏人,二流的人……”通过大坏笔,也许能找到记录。 这里说的都是可以的,因为全文索引的使用涉及到很多细节。 我们只需要知道大概的意思就可以了。 如果您有兴趣进一步使用它,那么在测试索引时,将给出一篇博文供您参考。

1.4. 空间索引

空间索引是在空间数据类型的字段上建立的索引。 MySQL中有四种空间数据类型,POINT和POINT。

创建空间索引时,使用关键字。

要求引擎为其创建空间索引的列必须声明为 NOT NULL。

4.索引操作(创建和删除)

4.1. 创建索引

4.1.1. 创建表时创建索引

4.1.1.1. 创建普通索引

CREATE TABLE book                 CREATE TABLE book
(                          (
bookid INT NOT NULL,                bookid INT NOT NULL,
bookname VARCHAR(255) NOT NULL,          bookname VARCHAR(255) NOT NULL,
authors VARCHAR(255) NOT NULL,           authors VARCHAR(255) NOT NULL,
info VARCHAR(255) NULL,               info VARCHAR(255) NULL,
comment VARCHAR(255) NULL,             comment VARCHAR(255) NULL, 
year_publication YEAR NOT NULL,           year_publication YEAR NOT NULL,
INDEX(year_publication)               KEY(year_publication) 
);                          );

通过以上两种方法就可以轻松创建。 通过这个例子,你可以比较一下格式,你就差不多明白格式的意思了。

mysql索引占用空间_mysql索引空间_mysql 空间索引 使用

通过打印结果,如果我们在创建索引时不写索引名,它会自动为我们使用字段名作为索引名。

测试:查看索引是否用于查询。

* 来自书籍 WHERE = 1990\G;

说明:虽然表中没有数据,但是有关键字用来检查索引是否正在被使用,并输出所使用索引的信息。

mysql索引占用空间_mysql 空间索引 使用_mysql索引空间

id:标识符。 这是查询序列号,即它在一条语句中出现的次数。 子语句中只有一个,所以是1。

:使用的查询类型表示为简单。 如果不使用UNION或者子查询,就简单了。 这意味着该查询期间将使用该索引。 其他值:最外层。 当有子查询时,会出现两个以上。 UNION:union 中的第二个或后续语句(连接两个表):在子查询中,第二个。

table:数据表的名称。 它们按照阅读的顺序排列。 由于这里只查询一张表,所以只显示一本书。

type:指定该数据表与其他数据表的关联关系。 该表中与搜索值匹配的所有记录都将被提取,并与从前一个表中提取的记录合并。 当 使用键的最左边前缀或者键不是键或索引时(换句话说, 无法根据键值仅获取一条记录),则使用 ref。 当仅根据键值查询少量匹配记录时,这是一种很好的连接类型。 (注意,我个人不是很理解,百度了很多资料,都是白话文,以后用到这类资料的时候,我会回去补充一下。这里不太懂对未来影响不大。)可能的值有: , const, , index 和 All

:MySQL在搜索数据记录时可以选择的各个索引。 该表中只有一个索引。

key:实际选择的索引

:显示MySQL使用的索引长度(即使用的索引数量)。 当键字段值为空时,索引长度为空。 注意, 的值可以告诉你mysql将在联合索引中实际使用哪些索引。 这里使用了1个索引,所以是1,

ref:给出关系中另一个数据表中数据列的名称。 常数(const),这里使用的1990年是一个常数。

rows:执行该查询时MySQL期望从该数据表中读取的数据行数。

extra:提供与关联操作相关的信息,如果没有则不写入任何内容。

上面有很多东西,你想了解多少就可以了解多少。 我们最重要的是看“key”和“key”这两个属性。 密钥如上所示。 指示索引的使用。

4.1.1.2. 创建唯一索引

CREATE TABLE t1
(
id INT NOT NULL,
name CHAR(30) NOT NULL,
UNIQUE INDEX UniqIdx(id)
);  
解释:对id字段使用了索引,并且索引名字为UniqIdx。
SHOW CREATE TABLE t1\G;

mysql索引占用空间_mysql索引空间_mysql 空间索引 使用

要查看查询中使用的索引,必须先向表中插入数据,然后再查询数据。 否则,如果发现未知的 id 值,则不会使用索引。

INTO t1(1,'xxx');

* 从 t1 开始,其中 id = 1\G;

mysql索引占用空间_mysql索引空间_mysql 空间索引 使用

可以看到,通过id查询时,会使用唯一索引。 而且我也尝试过查询不存在的id值,索引也不会被使用。 我认为原因是所有的id都应该存储在一个const中,而里面没有这样的id值,所以不需要搜索。

4.1.1.3。 创建主键索引

CREATE TABLE t2
(id INT NOT NULL,
name CHAR(10),
PRIMARY KEY(id)
);  
INSERT INTO t2 VALUES(1,'QQQ');
EXPLAIN SELECT * FROM t2 WHERE id = 1\G;

mysql索引空间_mysql索引占用空间_mysql 空间索引 使用

通过这个主键索引,我们应该认识到,其实我们之前声明的主键约束就是一个主键索引,只是我们之前没有学过,不知道而已。

4.1.1.4. 创建单列索引

这个其实不用说,前面几个都是单列索引。

4.1.1.5。 创建组合索引

复合索引是在多个字段上创建索引

创建表t3,对表中的id、name、age字段创建组合索引

表 t3

id INT 不为空,

名称 CHAR(30) NOT NULL,

年龄 INT NOT NULL,

信息 (255),

索引(id,姓名,年龄)

);

显示 t3\G;

mysql索引空间_mysql索引占用空间_mysql 空间索引 使用

解释最左边的前缀

组合索引遵循最左边的前缀,并使用索引中最左边的列集来匹配行。 这样的列集称为最左前缀。 如果你听不懂也没关系。 通过几个例子你就会明白。 例如,这里 id, name 由age和age三个字段组成的索引,在索引行中按照id/name/age的顺序存储。 该索引可以索引以下字段组合(id,name,age),(id,name)或(id)。如果要查询的字段不构成索引的最左边前缀,那么该索引将不会被使用。 例如,年龄或(姓名,年龄)组合将不会使用索引查询。

t3表中,查询id和name字段

* 来自 t3,其中 id = 1 AND name = 'joe'\G;

mysql 空间索引 使用_mysql索引空间_mysql索引占用空间

在t3表中查询(age,name)字段,这样就不用索引查询了。我们看看结果

* 从 t3 开始,其中年龄 = 3 并且姓名 = 'bob'\G;

mysql索引占用空间_mysql索引空间_mysql 空间索引 使用

4.1.1.6。 创建全文索引

全文索引可用于全文搜索,但只有存储引擎支持索引,并且仅服务于 CHAR 和 TEXT 列。 索引始终对整个列执行,不支持前缀索引,

表 t4

id INT 不为空,

名称 CHAR(30) NOT NULL,

年龄 INT NOT NULL,

信息 (255),

索引(信息)

)=;

显示表 t4\G;

mysql 空间索引 使用_mysql索引空间_mysql索引占用空间

使用所谓的全文搜索。 即在很多文本中,可以通过关键字找到记录。

INTO t4(8,'AAA',3,'文字太好了,嘿,我叫bob'),(9,'BBB',4,'我叫gorlr');

* FROM t4 WHERE MATCH(info) ('gorlr');

mysql 空间索引 使用_mysql索引空间_mysql索引占用空间

* FROM t4 WHERE MATCH(info) ('gorlr');

mysql索引空间_mysql索引占用空间_mysql 空间索引 使用

注意:使用全文检索时,需要使用MATCH函数,其全文检索有很多限制。 例如,只能通过引擎。 例如全文索引只能设置在CHAR、TEXT上。 例如,默认搜索关键字必须至少为 4 个字符。 如果搜索关键字太短,则会被忽略。 等等,如果你正在实验,你可能实验不了。有兴趣的同学可以阅读这篇文章,并使用全文检索

4.1.1.7。 创建空间索引

空间索引也必须使用引擎,并且空间类型的字段必须为非空。 我不知道这个空间索引具体能做什么。 可能和游戏开发有关,也可能和其他事情有关。 当你遇到它的时候你就知道了。 现在我只要求它可以被创建。

表 t5

g 不为空,

指数(克)

) = ;

显示表 t5\G;

mysql 空间索引 使用_mysql索引占用空间_mysql索引空间

4.1.2. 在现有表上创建索引

格式:ALTER TABLE 表名 ADD[||] [INDEX|KEY] [索引名](索引字段名)[ASC|DESC]

有了上面的基础,这里就不用过多解释了。

命令1:SHOW INDEX FROM 表名\G

查看表上创建的索引

显示书本\G 中的索引;

mysql索引占用空间_mysql 空间索引 使用_mysql索引空间

划重点,我们需要知道的只有5件事,用红色标注了。 如果你想了解更多,可以查看这方面的信息。 我个人觉得我们以后在实际工作中遇到这些的时候需要详细的了解一下。 捆。

Table:创建索引的表

:表示索引不唯一,1代表非唯一索引,0代表唯一索引,表示该索引是否为唯一索引。

:索引名称

指示该字段在索引中的位置。 对于单列索引,该值为1。对于组合索引,它是索引定义中各个字段的顺序(这只需要知道单列索引的值为1,对于组合索引,该值为1) 。

:表示定义索引的列字段

:表示索引的长度

Null:表示该字段是否可以有空值

:表示索引类型

4.1.2.1. 为表添加索引

以上面的book表为例,已经有一个了,现在我们给表添加一个普通索引

ALTER TABLE book ADD INDEX ((30));

mysql 空间索引 使用_mysql索引空间_mysql索引占用空间

查看输出结果,可以知道索引添加成功。

这里仅以普通索引为例,添加其他索引也是如此。 就以葫芦为例吧。 这里我就不一一解释了。

4.1.2.2. 使用 INDEX 创建索引。

格式:[||] [INDEX|KEY] 索引名 ON 表名(创建索引的字段名[]) [ASC|DESC]

说明:其实只是换汤不换药。 只是格式改变了。 所做的事情和上面一模一样。 让我们举个例子。

使用以下字段向 book 表添加公共索引:

书籍索引();

SHOW INDEX FROM book\G;//查看book表中的索引

mysql索引占用空间_mysql 空间索引 使用_mysql索引空间

解释:由于图像太大,未捕获第一个屏幕截图。 我们这里只要看到新添加的索引就说明成功了。 。 其他索引的创建方法相同。

4.2. 删除索引

前面我们讨论了向表添加索引并查询它们。

两种添加方式

1如何在创建表的同时创建索引,

2、建表后给表添加索引的两种方式。

查询方式

SHOW INDEX FROM 表名 \G; \G 只是使输出格式更好看

现在我们来说说删除表索引的两个操作。

格式1:ALTER TABLE 表名 DROP INDEX 索引名。

这是一个非常简单的声明。 让我们看一个例子。 它仍然对 book 表进行操作并删除我们刚刚添加到其中的索引。

1.删​​除book表中指定的索引。

更改表书掉落;

SHOW INDEX FROM book\G;//检查book表中的索引时,会发现索引已经没有了

格式2:DROP INDEX 索引名 ON 表名;

删除book表中指定的索引

放下书本;

显示书本\G 中的索引;

mysql 空间索引 使用_mysql索引空间_mysql索引占用空间

5. 总结

MySQL索引到这里就差不多完成了。 让我们总结一下到目前为止我们应该了解的内容。

1. 索引有什么用? 为什么要有索引?

这个非常重要。 你需要自己去理解它。 如果您不明白,请阅读顶部的解释。

2、指标分类

3. 指数操作

在表中创建索引、添加索引、删除索引、删除索引

标签: 索引 字段 查询

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码