例如:数据库中2万条记录,如果要执行一个查询,select * from table where num =1000,
如果没有建立索引,必须要遍历整个表,直到num=1000被找到为止,
如果在num这个列上设置索引,就不需要任何的扫描,直接在索引里面找到1000.
所以建立索引,能够提高数据库的查询速度
索引在存储引擎中实现,因此,每种存储引擎的索引都不一定完全相同,
并且每一种存储引擎也不一定支持所有索引类型.
MySQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关
MyISAM和InnoDB存储引擎只支持BTREE索引,
MEMORY/HEAP存储引擎可以支持HASH和BTREE索引
MySQL的索引分为以下几类:
索引的设计原则:
创建索引
创建普通索引:
1.创表时创建索引
create TABLE book(
bookid int not null,
bookname varchar(255) not null,
authors varchar(255) not null,
info varchar(255) null,
comment varchar(255) null,
year_publication year not null,
index(year_publication)
)
2.创表之后,执行语句
show create table book
执行之后,可以看到book表的 year_publication 字段成功创建了索引,索引名称为year_publication 为MySQL自动添加
3.使用explain语句查看索引是否在使用:
explain select * from book where year_publication=1990
执行之后:
创建唯一索引:
创建唯一索引的原因是减少查询索引列操作的执行时间,和普通的索引相比,索引列的值必须是唯一,但允许有空值,
如果是组合索引,则列值的组合必须唯一
1.创建表
create table t1(
id int not null,
name char(30) not null,
unique index UniqIdx(id)
)
2.执行创建之后,进行查看表结构
show create table t1
可以看到已经创建了一个名为UniqIdx的唯一索引
创建单列索引
单列索引是在数据表中的某一个字段上创建的索引,一个表可以创建多个单列索引,上述两个索引的创建都是属于单列索引
1.执行创表
create table t2(
id int not null,
name char(50) null,
index SingleIdx(name(20))
)
2.执行结束后,查看表结构:
可以看到.已经创建了名为SingleIdx的单列索引,索引长度为20
创建组合索引:
在多个字段上创建一个索引
1.执行创表语句:
create table t3(
id int not null,
name char(30) not null,
age int not null,
info varchar(255),
index MultiIdx(id,name,age(100))
)
2.执行结束,进行查看表结构:
show create table t3
3.同样也能看出,id,name,age成功建立了名为MultiIdx的组合索引
创建全文索引:
FULLTEXT(全文索引)可以应用于全文搜索,只有MyISAM存储引擎支持FULLTEXT索引,
并且为CHAR,VARCHAR,TEXT列创建索引
1.创建表
create table t4(
id int not null,
name char(30) not null,
age int not null,
info varchar(255),
FULLTEXT INDEX FullTxtIdx(info)
)engine=MyISAM
2.查看表结构
show create table t4
可以看到已经创建了一个FullTxtIdx的索引
全文索引适合大型数据集,对于小的数据库来说,用处比较小
创建空间索引
必须在MyISAM类型中的表中创建,并且空间类型的字段必须为非空!
1.创表
create table t5(
g GEOMETRY NOT NULL,
SPATIAL INDEX spatIdx(g)
)engine=MyISAM
2.查看表结构
show create table t5
可以看到,已经创建了名为spatIdx的空间索引
需要注意的是,创建指定空间类型字段值的非空约束.并且表的存储引擎为MyISAM
在已经存在的表创建索引
使用ALTER TABLE 语句创建索引
1.执行语句
alter table book add index BkName(bookname(30))
2.show index 查看表中索引
show index from book
可以看到新增了一个索引
创建唯一索引:
alter table book add index UniqiIdx(bookId)
创建单列索引:
alter table book add index BkcmtIdx(comment(50))
创建组合索引
alter table book add index BkAuandInfoIdx (authors(30),info(50))
创建全文索引:
alter table t6 add FULLTEXT infoFTIdx (info)
创建空间索引:
alter table t7 add spatial index spatIdx(g)
使用CREATE TABLE 语句创建索引
创建普通索引:
create index BkNameIdx on book(bookname)
创建唯一索引:
create unique index UniqIdx on book(bookId)
创建单列索引:
create index BKcmtIdx on book(comment(50))
创建组合索引:
create index BkAuAndInfoIdx on book(authors(20),info(50))
创建全文索引
create fulltext index on book (info)
创建空间索引:
create spatial index spatIdx on book(g)
删除索引
使用ALTER TABLE 语句删除索引
alter table 表名 drop index 索引名
使用DROP INDEX 语句删除索引
drop index 索引名 on 表名