MySQL索引概述
- 索引是一种将数据库中单列或多列的值进行排序的结构
- 通过索引查询数据,可以提高查询速度,也可降低服务器的负载
MySQL索引分类
- 普通索引(不应用任何限制条件的索引,可在任何数据类型中创建)
- 唯一索引(索引的值必须唯一)
- 全文索引(只创建在char、varchar或text类型的字段上)
- 单列索引(只对应一个字段的索引)
- 多列索引(在表的多个字段上创建一个索引)
- 空间索引(只能建立在空间数据类型上)
创建索引
语法:
create table table_name
(
属性名 数据类型[约束条件],
属性名 数据类型[约束条件],
......
[unique|fulltext|spatial] index }key[别名](属性名[ASC|DESC])
);
创建普通索引
#普通索引
create table score
(
id int auto_increment primary key not null,
name varchar(30) not null,
math int not null,
english int not null,
chinese int not null,
index(id)
);
show create table score;
创建唯一索引
#唯一索引
create table t_address
(
id int auto_increment primary key not null,
name varchar(30),
address varchar(200),
unique index UQ_address(id asc)
);
show create table t_address
创建全文索引
#全文索引
create table cards
(id int auto_increment primary key not null,
name varchar(30),
number int,
info varchar(50),
fulltext key ftk_number(number)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
MySql自带的全文索引只能用于数据库引擎为MYISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySql自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。
目前,使用MySql自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySql全文索引所能找到的词默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。
如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。
创建单列索引
#单列索引
create table telephone
(
id int auto_increment primary KEY not null,
name varchar(30),
tel varchar(30),
index idx_tel(tel(20))
);
创建多列索引
#多列索引
create table information
(
id int primary key auto_increment not null,
name varchar(30) not null,
sex varchar(30) not null,
birthday VARCHAR(30) not null,
index idx_name_sex(name,sex)
);
创建空间索引
#空间索引
create table list
(
id int PRIMARY key auto_increment not null,
goods geometry not null,
spatial index spt(goods)
)engine=myisam;
建立的数据表中创建索引
语法:
create [unique|fulltext|spatial] index index_name
on table_name(属性[(length)][ASC|DESC]);
#在已有的表上创建索引
create index idx_id on t1(id)
修改数据表结构添加索引
语法:
alter table table_name add[unique|fulltext|spatial] index index_name(属性名[(length)][ASC|DESC]);
#添加索引
alter table t1
add unique index idx_name(name(10))
删除索引
语法:
drop index index_name on table_name
#删除索引
drop index idx_name on t1