索引 - 创建/删除索引

  • 作者:KK

  • 发表日期:2017.3.24


查看一个表有哪些索引

SHOW INDEX FROM 表名;

创建/删除的命令

#创建主键索引
ALTER TABLE 表名 ADD PRIMARY KEY (字段名);

#删除主键索引
ALTER TABLE 表名 DROP PRIMARY KEY;


#创建唯一索引
ALTER TABLE 表名 ADD UNIQUE (字段名);

#删除主键索引
ALTER TABLE 表名 DROP UNIQUE;


#创建普通索引
ALTER TABLE 表名 ADD INDEX 索引名称 (字段名);

#删除普通索引
ALTER TABLE 表名 DROP INDEX 索引名称;


#创建全文索引
ALTER TABLE 表名 ADD FULLTEXT (字段名);

#删除全文索引(和删除普通索引一样)
ALTER TABLE 表名 DROP INDEX 索引名称;

执行创建命令后再SHOW INDEX FROM 表名看看索引列表,多观察一下


没有修改索引的命令

要修改一个索引,只能先删除,再创建新的


练习

为了对索引有一个基本的认知,请按顺序执行以下代码,略微认真地观察一下输出信息即可:

#建表
CREATE TABLE article (
  id int(11) NOT NULL AUTO_INCREMENT,
  title varchar(30) NOT NULL,
  type tinyint(3) NOT NULL,
  content text NOT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

#查看索引,结果有一个索引,就是id字段
SHOW INDEX FROM article;

#为type创建普通索引,索引命名为 typeIndex
ALTER TABLE article ADD INDEX typeIndex(type);

#再查看索引,多了一个叫typeIndex的索引
SHOW INDEX FROM article;

#为title添加普通索引
ALTER TABLE article ADD INDEX titleIndex(title);

#多了一个叫titleIndex的索引
SHOW INDEX FROM article;

#删除typeIndex这个索引
ALTER TABLE article DROP INDEX typeIndex;

#此时剩下id和titleIndex两个索引了
SHOW INDEX FROM article;

#为type创建唯一索引
ALTER TABLE article ADD UNIQUE(type);

#那个Key_name叫type的就是type字段的唯一索引,索引名称跟被索引的字段名称命名一样而已
SHOW INDEX FROM article;

#再创建一次
ALTER TABLE article ADD UNIQUE(type);

#多了个叫type_2的唯一索引,因为重复运行不会覆盖
SHOW INDEX FROM article;

#删除多创建的索引 type_2
ALTER TABLE article DROP INDEX type_2;

#为content创建全文索引
ALTER TABLE article ADD FULLTEXT(content);

#则多了个叫content的索引
SHOW INDEX FROM article;

#再来一次
ALTER TABLE article ADD FULLTEXT(content);

#于是也多了个content_2
SHOW INDEX FROM article;

#删除多创建的索引 content_2
ALTER TABLE article DROP INDEX content_2;

#取消id的主键索引,但失败报错,原因是id有自增属性
ALTER TABLE article DROP PRIMARY KEY;

#取消id的自增再说
ALTER TABLE article CHANGE id id int(10);

#这下删除id的主键索引成功了
ALTER TABLE article DROP PRIMARY KEY;

#主键索引 id 的确不见了
SHOW INDEX FROM article;

#恢复 id 为主键(其实就是加主键索引)
ALTER TABLE article ADD PRIMARY KEY(id);

#弄一条数据进去
INSERT INTO article(title,type,content) VALUES('a', 1, 'bbb');

#查出来,发现 id 是0,因为要另外设置自增才行
SELECT * FROM article;

#设置id为自增
ALTER TABLE article CHANGE id id int(10) NOT NULL auto_incriment;

#发现刚才id=0的记录变成了1
SELECT * FROM article;

在建表时就创建索引

以上的创建索引语句都是基于有数据表的情况下再另外执行来建表的

其实可以在建表的同时一边创建索引,比如下面就是建表时同时将id设为主键索引,将category_id设为普通索引,将content设为全文索引

CREATE TABLE article2(
	id INT AUTO_INCREMENT PRIMARY KEY,
	title VARCHAR(255),
	category_id INT,
	content TEXT,

	/*下面开始是索引设定*/
	INDEX(category_id),
	FULLTEXT(content,title)
);

在什么时候创建索引这其实通常不是我们要关心的事,所以我个人比较习惯在建表后,经过一番分析再通过ALTER语句来设定索引

而且MySql的命令那么多呀,我不想记太多语法,处理索引的时候我记得ALTER这个就好了

如果你喜欢在建表的时候就指定索引,这里我不会编写相关的文章,因为我自己也不去研究,用到的时候再上网搜