MYSQL - 创建索引、删除索引

170 阅读2分钟

创建索引

三种创建索引的方式:

  • CREATE TABLE语句,创建表时创建索引;
  • ALTER TABLE语句,在已存在的表上创建索引;
  • CREATE INDEX语句,在已存在的表上添加索引;

基本语法格式:

CREATE TABLE table_name [col_name data_type]
[UNIQUE|FULLTEXT|SPATIAL]
[INDEX|KEY]
[index_name]
(col_name [length])
[ASC | DESC]

UNIQUE FULLTEXT SPATIAL分别表示:唯一索引、全文索引、空间索引;

创建表时创建索引

普通索引

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

唯一索引

为id列创建了一个名为UniqIdx的唯一索引

CREATE TABLE t1
(
  id INT NOT NULL,
  name CHAR(30) NOT NULL,
  UNIQUE INDEX UniqIdx(id)
);

单列索引

在id列上建立一个名为SingleIdx的单列索引,索引长度为20

CREATE TABLE t2
(
  id INT NOT NULL,
  name CHAR(50) NULL,
  INDEX SingleIdx(name(20))
);

组合索引

创建了一个组合索引,组合索引遵循最左前缀。索引查询时只能查询(id,) / (id, name) / (id, name, age)

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

全文索引

只有MyISAM引擎支持全文索引,并且只为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;

使用ALTER TABLE table_name ADD 创建索引

可以创建唯一索引、全文索引、单列索引、组合索引等;

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

示例:

# 简单索引
ALTER TABLE t1
ADD INDEX idxforcol(col1)

# 全文索引
ALTER TABLE t1
ADD FULLTEXT idxforcol(col2)

# 唯一索引
ALTER TABLE t1
ADD UNIQUE INDEX idxforcol(col3)

# 组合索引
ALTER TABLE t1
ADD INDEX idxforcol(col1, col2, col3)

使用CRETAE INDEX创建索引

基本语法:

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

示例:

# 简单索引
CREATE INDEX idxforcol
ON t1(col1)

# 全文索引
CREATE FULLTEXT INDEX idxforcol
ON t1(col2)

# 唯一索引
CREATE UNIQUE INDEX idxforcol
ON t1(col3)

# 组合索引
CREATE INDEX idxforcol
ON t1(col1, col2, col3)

删除索引

  • ALTER
  • DROP

ALTER 删除索引

ALTER TABLE table_name DROP INDEX index_name;

DROP删除索引

DROP INDEX index_name ON table_name;