创建索引
索引: 数据库的索引好比新华字典的音序表,它对数据库库表中一列或多列的值进行排序后的一种结构,其作用就是提高表中的数据查询速度 普通索引:可以创建在任何数据类型中,其值是否唯一和非空没有固定的要求 唯一性索引:唯一性索引是由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)