索引 is what ?
索引是借助存储引擎实现的一种高效获取数据的数据结构。在查询数据时能有效避免全表扫面,从而实现高效获取数据。
由于索引是排好序的数据结构,这就能有效的维护数据的唯一性,并且实现高效获取数据,虽然查询数据的效率有了很大的提高,但是在对数据表进行 增、删、改时为了维护数据表的索引也耗费了一定的系统资源。
索引的创建
在创建表的时候创建索引
create table 表名( 列名1 数据类新 [约束条件], 列名2 数据类型 [约束条件], ...... [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [别名] (列名n[(长度)]) [ASC | DESC]; )engine=ENFINE_NAME;
说明:
UNIQUE : 可选参数,表示唯一索引;
FULLTEXT: 可选参数,表示全文索引;
SPATIAL: 可选参数,表示空间索引;
INDEX 和 KEY: 用来表示字段的索引,二选一;
别名: 可选参数,表示创建的索引名;
列名n: 指定索引对应的字段名称;
长度: 可选参数,表示索引的长度;
ASC 和 DESC : 可选参数,选择升序或降序。
普通索引
例如在 id 上创建
create table table_name( id int not null, name varchar(15), INDEX (id) );
唯一索引
create table table_name( id int not null, name varchar(15), UNIQUE KEY unique_id(id ASC) );
其实主键也是一种唯一索引——不能有空值。
全文索引
InnoDB引擎不支持,MyISAM支持性能较好,一般在 char 、varchar或text的列上创建;
create table 表名( 列名1, 列名2, ...... FULLTEXT INDEX fullindex(列名n) )engine=MyISAM;
多列索引
若是创建单例索引,括号中列出一个列名便好;若是创建多列索引,则括号中列出相关列的列名即可。
空间索引
Mysql使用关键字:SPATIAL 创建空间索引,空间索引只能建立在空间数据类型上,并且相应的字段必须有非空约束。而支持空间索引存储引擎只有 MyISAM。
Mysql空间数据类型:geometry、point、linestring、polygon。
在已建的数据表中创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name ON table_name(列名[(长度)] [ASC | DESC]);
对于普通索引可直接
CREATE INDEX index_name ON table_name(列名);
对于唯一索引,全文索引,空间索引 ,单列索引或多列索引使用相应的关键字创建即可。
修改表的结构添加索引
ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name (列名[(长度)] [ASC | DESC]);
例如添加一个多列索引:
ALTER TABLE table_name ADD INDEX index_name (列名1,列名2,...);
查看索引
可以从表的结构来查看索引:
SHOW CREATE TABLE table_name;
DESC table_name;
SHOW COLUMNS FROM table_name;
第一句sql语句会将 索引整合到表的创建语句中,然后将表的整个创建语句显示出来;
其中:UNIQUE KEY 'info' ('title') 便是;
后两句效果相同,以列表的方式给出:
其中,对于 Field title在 Key 列有值 UNI,这表明是唯一索引。
SHOW [INDEX | KEYS] FROM table_name;
这句sql 语句则会将表中的所有索引的详细的列出。
看得出 列 title 对应的索引名为 info , Non_unique 的值为 0 说明是唯一索引。
删除索引
DROP INDEX index_name ON table_name;
或
ALTER TABLE table_name DROP INDEX index_name;