索引:
数据库的索引好比新华字典的音序表,它对数据库库表中一列或多列的值进行排序后的一种结构,其作用就是提高表中的数据查询速度
普通索引:可以创建在任何数据类型中,其值是否唯一和非空没有固定的要求
唯一性索引:唯一性索引是由unique定义的索引,该索引所在的字段的值必须是唯一的
全文索引: 是由FULLTEXT定义的索引,它只能创建在char,varchar或text类型的字段上,而且,现在只有MYISAM存储引擎支持全文索引
单列索引: 单列索引指的是在表中单个字段上创建索引,它可以是普通索引,唯一索引或者全文索引,只要保证该索引只对应表中一个字段即可
多列索引: 多列索引指的是在表中多个字段上创建索引,只有在查询语句中使用了这些字段中第一个字段时,该索引才会被使用
空间索引: 空间索引是由SPATIAL定义的索引,它只能创建在空间数据类型的字段上
总结:需要注意的是,虽然索引可以提高数据的查询速度,但是索引会占用一定的磁盘空间,并且在创建和维护索引时,其消耗的时间时随着数据量的增加而增加的。因此,使用索引时,应该综合考虑索引的优点和缺点
创建索引:
1. 创建表的时候创建索引
CREATE TABLE 表名(
字段名 数据类型[完整性约束条件]
字段名 数据类型[完整性约束条件]
...
字段名 数据类型
[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [别名] (字段名1 [(长度)] [ASC|DESC])
);
关于以上语法的相关解释具体如下:
* UNIQUE 可选参数,表示唯一性约束
FULLTEXT 可选参数,表示全文约束
SPATIAL 可选参数,表示空间约束
INDEX和KEY :用来表示字段的索引,二者选一即可
别名: 可选参数,表示创建的索引的名称
字段名1: 指定索引对应字段的名称
长度:可选参数,用于表示索引的长度
ASC|DESC 可选参数,其中,ASC表示升序排列,DESC表示降序排序
常用单词:
MUL: multiple
PRI:primary
UNI: unique
~创建一个普通索引
下面的例子中INDEX前面没有前缀,所以他是一个普通索引
CREATE TABLE t1(
id INT,
name VARCHAR(20),
score FLOAT,
INDEX (id)
);
检查是否使用了索引,explain 命令可以查看后面的查询语句是如何执行的
explain select * from t1 where id=1;
~创建一个唯一索引
使用unique关键字创建
CREATE TABLE t2(
id INT,
name VARCHAR(20),
score FLOAT,
UNIQUE INDEX (id)
);
检查创建效果
show create table t2;
~创建全文索引
全文索引一定要是文本类型,引擎一定要是MyISAM;
CREATE TABLE t3(
id INT,
name VARCHAR(20),
score FLOAT,
FULLTEXT INDEX fulltext_name(name)
)ENGINE=MyISAM;
检查创建效果
show create table t3;
~创建单列索引
前面的几个例子都是单列索引
CREATE TABLE t4(
id INT,
name VARCHAR(20),
score FLOAT,
INDEX single_name(name(20))
);
检查创建效果
show create table t4;
~创建多列索引
第一列被用作查询条件时,才会导致多列索引被使用
CREATE TABLE t5(
id INT,
name VARCHAR(20),
score FLOAT,
INDEX multiple_name(id,name(20))
);
检查创建效果
explain select * from t5 where id=1;
~创建空间索引
空间索引只能用在几个特定的数据类型上,并且数据库引擎必须时MyISAM
CREATE TABLE t6(
id INT,
space GEOMETRY NOT NULL,
SPATIAL INDEX sp(space)
)ENGINE=MyISAM;
检查创建效果
show create table t6;
2. 使用CREATE INDEX 语句在已经存在的表上创建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 on 表名 (字段名1 [(长度)] [ASC|DESC]);
先创建一个表
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,
publicyear YEAR NOT NULL
);
~创建一个普通索引在bookid这一列上
create index index_id on book(bookid)
~创建一个唯一索引在bookid这一列上
create unique index qunique_id on book(bookid)
~创建一个多列索引在bookid这一列上
create index multiple_index on book(authors(20),info(20))
~创建全文索引,注意全文索引只能加在引擎时MyISAM的表上
drop table book;
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,
publicyear YEAR NOT NULL
)ENGINE=MyISAM;
CREATE FULLTEXT index ftindex on book (bookname)