MySQL索引操作:创建、添加和删除索引

如果对索引的作用不太了解的建议先阅读上一篇博文:MySQL索引的作用和分类介绍

创建索引

创建表的时候创建索引

  • 格式:
CREATE TABLE 表名[字段名 字段类型] [UNIQUE|FULLTEXT|SPATIAL|...] [INDEX|KEY] [索引名字] (字段名[length])   [ASC|DESC]
普通创建表语句               设置什么样的索引(唯一、全文等)    索引关键字   索引名字   对哪个字段设置索引  对索引进行排序

创建普通索引:

CREATE TABLE book                    CREATE TABLE boo
   (                              (
     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) 
   );                              );

上面两种方式创建都可以,通过这个例子可以对比一下格式,通过打印结果,我们在创建索引时没写索引名的话,会自动帮我们用字段名当作索引名。
在这里插入图片描述

  • 测试:看是否使用了索引进行查询
EXPLAIN SELECT * FROM book WHERE year_publication = 1990\G;
解释:虽然表中没数据,但是有EXPLAIN关键字,用来查看索引是否正在被使用,并且输出其使用的索引的信息。

在这里插入图片描述

字段 解释
id SELECT识别符。这是SELECT的查询序列号,也就是一条语句中,该select是第几次出现。在次语句中,select就只有一个,所以是1。
select_type 所使用的SELECT查询类型,SIMPLE表示为简单的SELECT,不实用UNION或子查询,就为简单的SELECT。也就是说在该SELECT查询时会使用索引。其他取值,PRIMARY:最外面的SELECT.在拥有子查询时,就会出现两个以上的SELECT。UNION:union(两张表连接)中的第二个或后面的select语句 SUBQUERY:在子查询中,第二SELECT。
table 数据表的名字。他们按被读取的先后顺序排列,这里因为只查询一张表,所以只显示book
type 指定本数据表和其他数据表之间的关联关系,该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref用于连接程序使用键的最左前缀或者是该键不是 primary key 或 unique索引(换句话说,就是连接程序无法根据键值只取得一条记录)的情况。当根据键值只查询到少数几条匹配的记录时,这就是一个不错的连接类型。(注意,个人这里不是很理解,百度了很多资料,全是大白话,等以后用到了这类信息时,在回过头来补充,这里不懂对后面的影响不大。)可能的取值有 system、const、eq_ref、index和All
possible_keys MySQL在搜索数据记录时可以选用的各个索引,该表中就只有一个索引,year_publication
key 实际选用的索引
key_len 显示了mysql使用索引的长度(也就是使用的索引个数),当 key 字段的值为 null时,索引的长度就是 null。注意,key_len的值可以告诉你在联合索引中mysql会真正使用了哪些索引。这里就使用了1个索引,所以为1
ref 给出关联关系中另一个数据表中数据列的名字。常量(const),这里使用的是1990,就是常量。
rows MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。
extra 提供了与关联操作有关的信息,没有则什么都不写。

创建唯一索引

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

在这里插入图片描述

要查看其中查询时使用的索引,必须先往表中插入数据,然后在查询数据,不然查找一个没有的id值,是不会使用索引的。

在这里插入图片描述

可以看到,通过id查询时,会使用唯一索引。并且还实验了查询一个没有的id值,则不会使用索引,我觉得原因是所有的id应该会存储到一个const tables中,返现其中并没有该id值,那么就没有查找的必要了。


创建主键索引

CREATE TABLE t2
	(
 		id INT NOT NULL,
		name CHAR(10),
		PRIMARY KEY(id)
	); 

在这里插入图片描述

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


创建组合索引

CREATE TABLE t3
	(
		id INT NOT NULL,
		name CHAR(30) NOT NULL,
		age INT NOT NULL,
		info VARCHAR(255),
		INDEX MultiIdx(id,name,age)
	);

在这里插入图片描述

最左前缀
   组合索引就是遵从了最左前缀,利用索引中最左边的列集来匹配行,这样的列集称为最左前缀,不明白没关系,举几个例子就明白了,例如,这里由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成索引最左面的前缀,那么就不会是用索引,比如,age或者(name,age)组合就不会使用索引查询。

  • 查询id和name字段:
    在这里插入图片描述

  • 查询age,name字段:
    在这里插入图片描述


创建全文索引:通过关键字就能够找到该记录

全文索引可以用于全文搜索,但只有MyISAM存储引擎支持FULLTEXT索引,并且只为CHAR、VARCHAR和TEXT列服务。索引总是对整个列进行,不支持前缀索引。

CREATE TABLE t4
	(
		id  INT NOT NULL,
		name CHAR(30) NOT NULL,
		age INT NOT NULL,
		info VARCHAR(255),
		FULLTEXT INDEX FullTxtIdx(info)
	)ENGINE=MyISAM;

在这里插入图片描述

  • 插入数据:
INSERT INTO t4 VALUES(8,'AAA',3,'text is so good,hei,my name is bob'),(9,'BBB',4,'my name is gorlr');

  • 查询:
    在这里插入图片描述

在这里插入图片描述

注意: 在使用全文搜索时,需要借助MATCH函数,并且其全文搜索的限制比较多,比如只能通过MyISAM引擎,比如只能在CHAR,VARCHAR,TEXT上设置全文索引。比如搜索的关键字默认至少要4个字符,比如搜索的关键字太短就会被忽略掉。等等,如果你们在实验的时候可能会实验不出来。


创建空间索引

空间索引也必须使用MyISAM引擎, 并且空间类型的字段必须为非空。 这个空间索引具体能干嘛我也不知道,可能跟游戏开发有关,可能跟别的东西有关,等遇到了自然就知道了,现在只要求能够创建出来。

CREATE TABLE t5
	(
		g GEOMETRY NOT NULL,
		SPATIAL INDEX spatIdx(g)
	) ENGINE = MyISAM;

在这里插入图片描述

在已经存在的表上创建索引

格式

ALTER TABLE 表名 ADD[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [索引名] (索引字段名)[ASC|DESC]
  • 查看一张表中所创建的索引
    在这里插入图片描述

为表添加索引

在这里插入图片描述

使用CREATE INDEX创建索引

  • 格式:
CREATE [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] 索引名称 ON 表名(创建索引的字段名[length])[ASC|DESC]

在这里插入图片描述

在这里插入图片描述

删除索引

格式一

ALTER TABLE 表名 DROP INDEX 索引名

在这里插入图片描述

在这里插入图片描述

格式二

DROP INDEX 索引名 ON 表名

在这里插入图片描述

转自:https://www.cnblogs.com/whgk/p/6179612.html

猜你喜欢

转载自blog.csdn.net/XU906722/article/details/84438048