MySQL索引介绍(一)

197 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

本文参考自宋红康老师的课程

索引的创建与设计原则

1. 索引的声明与使用

1.1 索引的分类

  • 按照功能逻辑:普通索引、唯一索引、主键索引、全文索引
  • 按物理实现方式:聚簇索引、非聚簇索引
  • 按作用字段个数:单列索引、联合索引
1.普通索引

在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,由字段本身的完整性约束条件决定。

2.唯一性索引

使用unique可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值。一张数据表中可以有多个唯一索引。

3.主键索引

主键索引是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,即not null+unique,一张表中最多只有一个主键索引。

4.单列索引

在表中的单个字段上创建索引。单列索引只根据该字段进行索引,单列索引可以是普通索引,也可以是唯一性索引、全文索引。只要保证该索引只对应一个字段即可。一个表可以有多个单列索引。

5.多列(组合、联合)索引

多列索引是在表的多个字段组合上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中使用了这些字段中的第一个字段时才会被使用。使用多列索引时遵循最左前缀

6.全文索引(全文检索)

全文检索是目前搜索引擎使用的一种关键技术。能够利用分词技术等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能筛选出想要的搜索结果,适合大型数据集。

使用FULLTEXT可以设置索引为全文索引。在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空置。全文索引只能创建在CHARVARCHARTEXT类型及其系列类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度

全文索引典型的有两种类型:自然语言全文索引和布尔全文索引。

自然语言搜索引擎将计算每一个文档对象和查询的相关度。相关度是基于匹配的关键词的个数以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。常见的单词将不会被搜索。

MySQL数据库从8.23.23版开始支持全文索引,5.6.4以前只有MyISAM支持,5.6.4版本以后InnoDB开始支持,官方版本不支持中文分词,需要第三方分词插件。5.7.6中内置了nagram全文解析器,支持亚洲语种的分词。

7.空间索引

使用SPATIAL可以设置索引为空间索引。只能建立在空间数据类型上,比如:GEOMETRY、POIN、LINESTRING、POLYGON等。目前只有MyISAM支持空间检索,而且索引的字段不能为空值。

InnoDB、MyISAM、Memory:支持B-Tree、Full-text等索引,不支持Hash索引。

NDB:支持Hash索引,不支持B-Tree、Full-text等索引。

Archive:不支持B-Tree、Hash、Full-text等索引。

1.2 创建索引

1.创建表时创建索引

使用CREATE TABLE创建表时可以定义主键约束、外键约束或唯一性约束,在定义约束的同事相当于在指定列上创建了一个索引。

显示创建表时创建索引基本语法如下:

  • UNIQUE、FULLTEXT和SPATIAL为可选参数,分别表示唯一索引、全文索引和空间索引
  • INDEX和KEY为同义词,作用相同,用于指定创建索引
  • index_name为指定索引的名称,可选参数,如果不指定,默认col_name为索引名
  • col_name为需要创建索引的字段列
  • length为索引的长度,可选参数,只有字符串类型的字段才能指定索引长度
  • ASC/DESC指定升序或降序的索引值存储

①创建普通索引

②创建唯一索引

③主键索引

设定主键后会自动建立索引,innodb为聚簇索引:

删除主键索引:

修改主键索引:必须先删除(drop)原索引,再新建(add)索引

④创建单列索引

⑤创建组合索引

⑥创建全文索引

全文索引不用LIKE进行查询,使用match+against:

SELECT * FROM papers WHERE MATCH(title,content) AGAINST (‘查询字符串’);

  • 使用全文索引前,确定版本的支持情况
  • 全文索引比LIKE快很多,但可能存在精度问题
  • 如果需要全文索引的是大量数据,建议先添加数据,再创建索引

⑦创建空间索引

2.在已存在的表上创建索引

①使用ALTER TABLE创建索引:

②使用CREATE INDEX创建索引:

1.3 删除索引

①使用ALTER TABLE删除索引:

②使用DROP INDEX删除索引:

添加AUTO_INCREMENT约束字段的唯一索引不能被删除。

删除表中的列时,如果该列为索引的组成部分,该列也会从索引中删除。