Mysql索引

目录

一、索引的分类

二、创建索引

1.隐式创建索引

2.显式创建索引

创建表的同时创建索引

在已创建的表上添加索引

三、删除索引 


一、索引的分类

MySQL 的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
  • 功能逻辑 上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。
  • 按照 物理实现方式 ,索引可以分为 2 种:聚簇索引和非聚簇索引。
  • 按照 作用字段个数 进行划分,分成单列索引和联合索引。

1. 普通索引

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

2. 唯一性索引

        唯一性索引,使用UNIQUE参数设置索引为唯一性索引,即创建改索引时,其值必须唯一,但允许为空值。一张表中可以有多个唯一性索引。

3. 主键索引
        主键索引可以认为是一种特殊的唯一性索引,因为其值不能为空且必须唯一,即相当于在唯一性索引上加了不为空的约束,也就是NOT NULL+UNIQUE,需要注意的是,一张表中只能有一个主键索引。另外,创建主键约束的同时会自动创建主键索引。
这是由主键索引的物理实现方式决定的,因为数据存储在文件中只能按照一种顺序进行存储。
4. 单列索引
        在表中的单个字段上面创建索引。即只根据该字段进行索引,单列索引可以认为是普通索引,也可以认为是唯一性素养,还可以是全文索引,只要保证该索引值对应一个字段即可。一个表中可以含有多个单列索引。
5. 多列(组合、联合)索引
        多列索引是在表的多个字段组合上创建的一个索引,该索引指向创建时的多个字段,可以通过这几个组合的第一个字段进行查询,当查询条件中使用了这些字段的一个时索引才会被使用。
6. 全文索引
        全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用 分词技术等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。全文索引非常适合大型数据集,对于小的数据集,它的用处比较小。
        使用参数FULLTEXT可以设置索引为全文索引。在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引只能创建在CHAR、VARCHAR或TEXT类型及其系列类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。例如,表 student 的字段 information 是 TEXT 类型该字段包含了很多文字信息。在字段information上建立全文索引后,可以提高查询字段information的速度。
全文索引典型的有两种类型
  • 自然语言的全文索引
  • 布尔全文索引
        自然语言搜索引警将计算每一个文档对象和查询的相关度。这里,相关度是基于匹配的关键词的个数,以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过50%的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。
7. 补充:空间索引
        使用参数SPATIAL可以设置索引为空间索引。空间索引只能建立在空间数据类型(以Mysql为例,有GEOMETRY、POINT、LINESTRING和POLYGON等空间数据类型)上,这样可以提高系统获取空间数据的效率。目前只有MyISAM存储引擎支持空间检索,而且索引的字段不能为空值。对于初学者来说,这类索引很少会用到。

二、创建索引

1.隐式创建索引

加约束时创建索引,在声明有主键约束,唯一性约束,外键约束的字段上,会自动创建对应的约束。

2.显式创建索引

创建表的同时创建索引

语法如下:

CREATE TABLE table_name [col_name data_type] 
[UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] 
[index_name] (col_name [length]) [ASC | DESC]
  • UNIQUE FULLTEXT SPATIAL 为可选参数,分别表示唯一索引、全文索引和空间索引;
  • INDEX KEY 为同义词,两者的作用相同,用来指定创建索引;
  • index_name 指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;
  • col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
  • length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
  • ASC DESC 指定升序或者降序的索引值存储。

① 创建普通索引

CREATE TABLE book( 
book_id INT , 
book_name VARCHAR(100), 
AUTHORS VARCHAR(100), 
info VARCHAR(100) , 
COMMENT VARCHAR(100), 
year_publication YEAR,
#声明索引
INDEX idx_bname(book_name)
);

Mysql索引_第1张图片

 通过命令查看索引

方式一:

#选中数据库
USE dbtest;
#查看索引
SHOW CREATE DAtABASE book;

查看结果如下:Mysql索引_第2张图片

方式二:

SHOW INDEX FROM book;

 查看结果如下:

 ② 创建唯一性索引

声明有唯一索引的字段在添加数据时要保证唯一性,但可添加null值

#创建唯一性索引
CREATE TABLE book1( 
book_id INT , 
book_name VARCHAR(100), 
AUTHORS VARCHAR(100), 
info VARCHAR(100) , 
COMMENT VARCHAR(100), 
year_publication YEAR,
#声明索引
UNIQUE INDEX uk_idx_cmt(book_name)
);

 ③ 创建主键索引

通过定义主键约束的方式创建主键索引

#创建主键索引
CREATE TABLE book2( 
book_id INT PRIMARY KEY, 
book_name VARCHAR(100), 
AUTHORS VARCHAR(100), 
info VARCHAR(100) , 
COMMENT VARCHAR(100), 
year_publication YEAR
);

④创建单列索引

#创建单例索引
CREATE TABLE book1( 
book_id INT , 
book_name VARCHAR(100), 
AUTHORS VARCHAR(100), 
info VARCHAR(100) , 
COMMENT VARCHAR(100), 
year_publication YEAR,
#声明索引
INDEX single_idx_name(book_name)
);

⑤创建组合索引

#创建组合索引
CREATE TABLE book1( 
book_id INT , 
book_name VARCHAR(100), 
AUTHORS VARCHAR(100), 
info VARCHAR(100) , 
COMMENT VARCHAR(100), 
year_publication YEAR,
#声明索引
INDEX mul_bid_bname_if(book_id, book_name, info)
);

⑥创建全文索引

举例一、创建表book1 ,在表中的 info 字段上建立全文索引, SQL 语句如下:
#创建全文索引
CREATE TABLE book1( 
book_id INT , 
book_name VARCHAR(100), 
AUTHORS VARCHAR(100), 
info VARCHAR(100) , 
COMMENT VARCHAR(100), 
year_publication YEAR,
#声明索引
FULLTEXT INDEX ft_idx_info(info)
);

举例二、创建了一个给book_namebook_id字段添加全文索引的表。

#创建全文索引
CREATE TABLE book1( 
book_id INT , 
book_name VARCHAR(100), 
AUTHORS VARCHAR(100), 
info VARCHAR(100) , 
COMMENT VARCHAR(100), 
year_publication YEAR,
#声明索引
FULLTEXT INDEX (book_id, book_name)
);

⑦创建空间索引

空间索引创建中,要求空间类型的字段必须为 非空
CREATE TABLE test5( 
geo GEOMETRY NOT NULL, 
SPATIAL INDEX spa_idx_geo(geo) 
);

在已创建的表上添加索引

可以使用 ALTER TABLE 语句或者 CREATE INDEX语句在已经存在的表中创建索引。

①ALTER TABLE ... TO ...

ALTER TABLE table_name ADD [ UNIQUE | FULLTEXT | SPATIAL ] [ INDEX | KEY ]
[index_name] (col_name[length],...) [ ASC | DESC ]

②CREATE INDEX ... ON ...

CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX index_name
ON table_name (col_name[length],...) [ ASC | DESC ]

三、删除索引 

1 ALTER TABLE ... DROP ...
  ALTER TABLE 删除索引的基本语法格式如下:
ALTER TABLE table_name DROP INDEX index_name;
2. DROP INDEX ... on ...
DROP INDEX 删除索引的基本语法格式如下:
DROP INDEX index_name ON table_name;
提示:删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成 索引的所有列都被删除,则整个索引将被删除。

你可能感兴趣的:(mysql,数据库,sql)