MySql的索引(1)

索引用来快速的寻找特定值的记录,其使用B树之类的形式保存。如果没有索引,则查询就会全表扫描,当记录越多的时候,代价就越高。如果有了索引,则无需扫描任何记录就可以在索引中找到数据。

索引分类

主键索引

其是一种唯一性索引,必需的其它为"primary key",使用"auto_increment"时,一般会自动创建为主键索引

#添加
alter table 表名 add primary key (列名); 
#清除
alter table 表名 drop primary key;

唯一索引

索引列的所有值只能出现一次,一个表可以指定多个列来组成唯一索引,不同列的值可以相同

Unique字段可以为Null,并且可以有多个NULL,如果是具体的内容,则不能重复,包括空字符串

#创建语法
create unique index <索引名称> on table (列名1,列名2...);
#修改
alter table 表名 add unique 索引名称 (列名1,列名2...);
#创建表的时候也可以直接指定

普通索引

一般由[key 或 index]定义的索引,其唯一作用就是加快对数据的访问速度。因此,只需要对经常出现在 where 或者 排序 条件中的列创建索引。推荐使用一个数据最整齐、最紧凑的列(如整数类型的数据列)来创建索引

语法:

#创建语法
create index 索引名 on 表名(列1,列2...);

全文索引

在创建表的时候使用 "FULLTEXT(列名1,列名2...)"

create table articles (
  id int unsigned auto_increment not null primary key,
  title varchar(100),
  body text,
  fulltext(title, body)
) engine=myisam charset utf8;
# 以上创建表的语句,对列[title & body]进行了全文索引

使用方法:

全文索引 ,不能通过 like 来查询,其有特定的语法

#错误语法,使用like并不会使用到索引
select * from articles where body like "%mysql%";
#正确语法
select * from articles where match(title,body) against('database');

说明

在mysql中的fulltext只对 myisam 存储引擎有效,而且还只能处理英文,

如果有中文的要考虑 sphinx(coreseek)

全文索引查询返回的结果是数据的匹配度

聚集索引

表中行的物理顺序与键值的索引顺序相同,一个表只能包含一个聚集索引