分类:
- 主键索引:一个表只能有一个主键索引,但是可以有复合主键索引.
- 普通索引:一个表可以有多个普通索引.
- 全文索引:只有(varchar,text英文)myisam引擎才有(mysql5.6版本后也有),只对英文有效,对中文索引采用sphinx来操作
- 唯一索引:一个表可以有多个唯一索引,就是字段的值不可以相同(一般使用程序控制一个字段的唯一性)
- 复合(多列、联合)索引:由多个字段组成的索引
创建表的索引:
在建表create table的时候提前创建好
例:
create table t_key(
id int not null auto_increment,
title varchar(30) not null default ”,
email varchar(30) not null default ”,
time int not null default 0,
primary key(id),主键索引
key key_title(title),普通索引
unique key uni_key(email)唯一索引
)engine=innodb default charset=utf8;
是建表之后通过alter进行建立索引:
example0表中的name字段上建立名为index13_name的索引
ALTER TABLE example0 ADD INDEX index13_name ( name(20) ) ;
在index14表中的course_id字段上,建立名为index14_id的唯一性索引
ALTER TABLE index14 ADD UNIQUE INDEX index14_id ( course_id ) ;
查看表的索引:
desc 表名;
show index from 表名;
show keys from 表名\G;
查看建表语句:
show create table 表名;
删除索引:
删除主键索引:alter table table_name drop primary key (注意:必须先去除自动增长的属性才可以删除主键
删除普通索引、唯一索引等:alter table table_name drop key key_name
使用索引的原则:
- where后的条件,order by ,group by 等这样过滤时,后面的字段最好加上索引。根据实际情况,选择PRIMARY KEY、UNIQUE、INDEX等索引,但不是越多越好,要适度
- 不要对索引字段使用运算或函数处理,否则使用不到索引
- like原则,like “aaa%” :可以使用到索引,like “%aaa%” :百分号%出现在最左边会全表扫描
- 对于or查询,or前后的字段都必须是索引,如果其中一个不是,那么都将使用不到索引查询
- 复合(多列)索引的最左原则,顾名思义,就是最左优先(只要有最左边的字段就行)
前缀索引:
我们可以把一个字段的前面几个字符作为索引,这样会降低我们的索引文件长度.
例:
给一个字段设置为前缀索引为6的长度
alter table table_name add key index_name(city(6))
注意!
MySQL的每个单表中所创建的索引长度是有限制的,在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,
对于创建innodb的组合索引,如果各个列中的长度不超过767,则不再计算所有列的总长度,
如果有超过767的,则给出报警,索引最后创建成功,但是对于超过767字节的列取前缀索引;
对于innodb的单列索引,超过767的,给出warning,最终索引创建成功,取前缀索引(取前255字节)。