MySQL:索引

建表时创建索引

普通索引

-- 在book表中的year_publication字段上建立普通索引
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)
);

-- 使用EXPLAIN语句查看索引是否正在使用
explain select * from book where year_publication=1990;

唯一索引

-- 创建一个表t1,在表中的id字段上使用UNIQUE关键字创建唯一索引
CREATE TABLE t1
(
  id   INT NOT NULL,
  name CHAR(30) NOT NULL,
  UNIQUE INDEX UniqIdx(id)
);

单列索引

-- 创建一个表t2,在表中的name字段上使用创建单列索引
CREATE TABLE t2
(
  id   INT NOT NULL,
  name CHAR(50) NULL,
  INDEX SingleIdx(name(20))
);

组合索引

-- 创建表t3,在表中的id,name和info字段上建立组合索引
CREATE TABLE t3
(
  id    INT NOT NULL,
  name  CHAR(30) NOT NULL,
  age   INT NOT NULL,
  info  VARCHAR(255),
  INDEX MultiIdx(id, name, info(100))
);

全文索引

-- 创建表t4,在表中的info字段上建立全文索引
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;

空间索引

-- 创建表t5,在空间类型为GEOMETRY的字段上创建空间索引
CREATE TABLE t5 ( 
	g GEOMETRY NOT NULL, 
	SPATIAL INDEX spatIdx ( g ) 
) ENGINE = MyISAM;

ALTER TABLE

格式:ALTER TABLE 表名 ADD[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [索引名] (索引字段名)[ASC|DESC]

普通索引

-- 在book表中的bookname字段上建立名为BkNameIdx的普通索引
ALTER TABLE book ADD INDEX BkNameIdx ( bookname ( 30 ) );

唯一索引

-- 在book表的bookId字段上建立名称为UniqidIdx 的唯一索引
ALTER TABLE book ADD UNIQUE INDEX UniqidIdx ( bookId );

单列索引

-- 在book表的comment字段上建立单列索引
ALTER TABLE book ADD INDEX BkcmtIdx ( comment(50) );

组合索引

-- 在book表的authors和info字段上建立组合索引
ALTER TABLE book ADD INDEX BkAuAndInfoIdx ( authors(20),info(50) );

全文索引

-- 创建表t6,在t6表上使用ALTER TABLE创建全文索引
-- 首先创建表t6,注意修改ENGINE参数为MyISAM,MySQL默认引擎InnoDB不支持全文索引
CREATE TABLE t6
(
  id    INT NOT NULL,
  info  CHAR(255)
) ENGINE=MyISAM;
--使用ALTER TABLE语句在info字段上创建全文索引:
ALTER TABLE t6 ADD FULLTEXT INDEX infoFTIdx ( info );

空间索引

-- 创建表t7,在t7的空间数据类型字段g上创建名称为spatIdx的空间索引
CREATE TABLE t7 ( g GEOMETRY NOT NULL )ENGINE=MyISAM;
-- 使用ALTER TABLE在表t7的g字段建立空间索引,
ALTER TABLE t7 ADD SPATIAL INDEX spatIdx(g);

CREATE INDEX

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

普通索引

-- 在book表中的bookname字段上建立名为BkNameIdx的普通索引
CREATE INDEX BkNameIdx ON book(bookname);

唯一索引

-- 在book表的bookId字段上建立名称为UniqidIdx 的唯一索引
CREATE UNIQUE INDEX UniqidIdx  ON book ( bookId );

单列索引

-- 在book表的comment字段上建立单列索引
CREATE INDEX BkcmtIdx ON book(comment(50) );

组合索引

-- 在book表的authors和info字段上建立组合索引
CREATE INDEX BkAuAndInfoIdx ON book ( authors(20),info(50) );

全文索引

-- 删除表t6,重新建立表t6,在t6表中使用CREATE INDEX语句,在CHAR类型的info字段上创建全文索引
drop table t6;

CREATE TABLE t6
(
id    INT NOT NULL,
info  CHAR(255)
) ENGINE=MyISAM;

CREATE FULLTEXT INDEX ON t6(info);

空间索引

-- 删除表t7,重新创建表t7,在t7表中使用CREATE INDEX语句,在空间数据类型字段g上创建名称为spatIdx的空间索引
-- 首先删除表t7,并重新建立该表
drop table t7;

CREATE TABLE t7 ( g GEOMETRY NOT NULL )ENGINE=MyISAM;

-- 使用CREATE INDEX语句在表t7的g字段建立空间索引,
CREATE SPATIAL INDEX spatIdx ON t7 (g);

查看索引

show index from table_name;
show keys from table_name;

删除唯一索引

-- 删除book表中的名称为UniqidIdx的唯一索引
ALTER TABLE book DROP INDEX UniqidIdx;

删除组合索引

-- 删除book表中名称为BkAuAndInfoIdx的组合索引
DROP INDEX BkAuAndInfoIdx ON book;

ALTER TABLE和CREATE INDEX的区别

  1. CREATE INDEX必须提供索引名,对于ALTER TABLE,将会自动创建,如果你不提供;
  2. CREATE INDEX一个语句一次只能建立一个索引,ALTER TABLE可以在一个语句建立多个,如:
ALTER TABLE Student ADD PRIMARY KEY (ID), ADD INDEX (Name,Info);
  1. 只有ALTER TABLE 才能创建主键;
posted @ 2020-01-16 09:08  firebet  阅读(412)  评论(0编辑  收藏  举报