建表时创建索引
普通索引
-- 在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的区别
- CREATE INDEX必须提供索引名,对于ALTER TABLE,将会自动创建,如果你不提供;
- CREATE INDEX一个语句一次只能建立一个索引,ALTER TABLE可以在一个语句建立多个,如:
ALTER TABLE Student ADD PRIMARY KEY (ID), ADD INDEX (Name,Info);
- 只有ALTER TABLE 才能创建主键;