杉哥的个人博客

mysql的索引

分类:

  1. 主键索引:一个表只能有一个主键索引,但是可以有复合主键索引.
  2. 普通索引:一个表可以有多个普通索引.
  3. 全文索引:只有(varchar,text英文)myisam引擎才有(mysql5.6版本后也有),只对英文有效,对中文索引采用sphinx来操作
  4. 唯一索引:一个表可以有多个唯一索引,就是字段的值不可以相同(一般使用程序控制一个字段的唯一性)
  5. 复合(多列、联合)索引:由多个字段组成的索引

创建表的索引:

在建表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

使用索引的原则:

  1. where后的条件,order by ,group by 等这样过滤时,后面的字段最好加上索引。根据实际情况,选择PRIMARY KEY、UNIQUE、INDEX等索引,但不是越多越好,要适度
  2. 不要对索引字段使用运算或函数处理,否则使用不到索引
  3. like原则,like “aaa%” :可以使用到索引,like “%aaa%” :百分号%出现在最左边会全表扫描
  4. 对于or查询,or前后的字段都必须是索引,如果其中一个不是,那么都将使用不到索引查询
  5. 复合(多列)索引的最左原则,顾名思义,就是最左优先(只要有最左边的字段就行)

前缀索引:

我们可以把一个字段的前面几个字符作为索引,这样会降低我们的索引文件长度.

例:

给一个字段设置为前缀索引为6的长度

alter   table  table_name  add  key  index_name(city(6))

注意!

MySQL的每个单表中所创建的索引长度是有限制的,在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,

对于创建innodb的组合索引,如果各个列中的长度不超过767,则不再计算所有列的总长度,

如果有超过767的,则给出报警,索引最后创建成功,但是对于超过767字节的列取前缀索引;

对于innodb的单列索引,超过767的,给出warning,最终索引创建成功,取前缀索引(取前255字节)。