索引用来快速的寻找特定值的记录,其使用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)
全文索引查询返回的结果是数据的匹配度
聚集索引
表中行的物理顺序与键值的索引顺序相同,一个表只能包含一个聚集索引