什么是索引
索引(index),是一种增加筛选(select)速度的方法,在数据库中,查询语句的使用频率很高,所以我们需要增加筛选的速度。
同时,索引是一种数据结构,在mysql中,Innodb使用的索引结构是B+树。
索引的原理
数据库运行在应用层,同时在其中存在这一个缓冲区,数据库Innodb引擎以16kb作为库的基本单位,叫做page。
page结构如下,这是Innodb中底层的结点结构。
索引建立的底层,在Innodb中,为了加快底层的搜索,我们需要建立目录,同时为了加快目录的搜索,我们也可以对目录加目录,从而形成一棵B+树。
上述为聚簇索引的树结构,聚簇索引就是将内容和索引放在同一个结点中。
Innodb的主键表使用的是聚簇索引,其他索引使用的是辅助索引/非聚簇索引,及结点不存储内容,只存储索引和主键索引的映射,要查询到某个索引,只需要通过映射回到主键索引中查询,这叫做回表查询。
myisam采用的是非聚簇索引,及叶子结点存储的是索引和该索引所对应的物理磁盘地址,这是因为myisam的数据和索引是分离的,而innodb的数据和索引是在同一个文件内。
其他索引的叶子结点存储的也是索引文件。
综上,myisam相对简单,不需要回标查询,效率要稍高innodb一筹。
索引的类型
查看一个表的索引。
show index from t_name;
我们可以看到,表中有主键索引,有唯一键索引,同时每个索引都有一个keyname,代表索引的名字。
每一个索引都会生成一颗B+树,只有主键索引会以聚簇索引的形式展现,其他索引则是辅助索引。
主键索引
主键索引需要创建主键。
alter table t_name add primary key(c1, c2 …)。
同时如果表内没有被创建主键,则表中默认会存在一个主键。 以这个默认的主键为索引建立B+树,方便搜索,所以这就是为什么我们插入有主键的表时,会默认按照主键排序。
删除主键索引就是直接删除主键。
alter table t_name drop primary key
唯一键索引
唯一键索引需要创建唯一键。
alter table t_name add unique key(c1)。
创建唯一键索引后,使用辅助索引。
删除索引可以使用删除索引的指令。
alter table t_name drop index keyname
或者删除唯一键。
alter table t_name drop unique key(c1)
普通索引
普通索引和唯一键索引和主键索引不同,设置为普通索引的列可以重复。
创建普通索引。
alter table t_name add index(c1, c2)。
如果一个索引以两个key作为索引,则他们是一个索引,只会生成一颗B+树。
删除索引可以使用删除索引的指令。
alter table t_name drop index keyname
创建索引的条件
我们创建索引的目的是为了加快搜索,索引我们可以给以下条件的列增加索引。
1).唯一性好的。
2).平凡被查询的。
3).经常被作为where字句的判断条件的。
满足以上三点的建议被设置为索引。