1.什么是索引?
索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。
相当于书的目录,作用是提高SELECT语句的效率。
既然相当于目录,目录也是书的内容,存储的内容都是数据形式,所以索引也是数据。
2.为什么需要索引?
我们需要从表中搜寻数据,常见的方法是全表扫描,即从表的第一个数据块开始查找,按顺序一直找到最后一个数据块。数据量少时,对MySQL服务要求不高,但数据量大时对MySQL性能消耗大,查找效率低下,那么有没有高效率的方法呢?
我们看书寻找特定内容时,可以先从目录找到目标内容,再去具体页数寻找内容,索引便应运而生。
3.MySQL中的索引
innodb存储引擎支持3类索引
b+树索引
哈希索引
全表索引
其中b+树索引使用最多,故本文只讨论b+树索引
b+树是一种数据结构,用来存放索引的数据
b+树(BTREE)分为聚集索引(clustered index)和辅助索引(secondary index or non-clustered index)
聚集索引
定义:按照按照每张表的主键构造一棵b+树,同时叶子节点中存放的就是表中的整行数据。
也将聚集索引的叶子节点叫做数据页,索引组织表(即表中的数据照主键的顺序存放)中的数据也是索引的一部分。因为实际的数据页只能按照一棵b+树进行排序,因此一张表只能有一个聚集索引。查询优化器倾向于使用聚集索引,因为聚集索引能够在索引的叶子结点上直接找到数据。
#因为索引有排序功能,所以使用查询语句查询带有索引的行时,不需要添加排序语句
辅助索引
叶子节点不包含行的全部数据。叶子节点除了包含行的索引键值以外,每个索引行还包含了一个主键值,该主键值告诉innodb存储引擎,哪里可以找到与索引对应的数据
#包含其他列的数据和指向主键索引的指针
单列索引
索引的键值数量为1
复合索引
和单列索引不同的是复合索引的键值数量不是1,而是大于等于2
#复合索引中的单个前导列做查询,也可以使用该复合索引,但对于非前导列的查询不可以使用复合查询。
创建索引
CREATE INDEX id_name_idx ON IG(id,name);
#在表IG中创建以id为前导name为非前导的复合索引id_name_idx
查看索引
show index from IG;
#查看表IG的所有索引
表中的一些参数:
Key_name --》索引的名字
Non_unique--》为0表示为唯一索引,为1表示为非唯一索引
Collation --》列索引如何保存为。A表示为升序排序,null表示为不排序
Cardinality--》数值越接近行数,字段越丰富,越适合作索引,相反则不适合作索引
删除索引
DROP INDEX id_name_idx on IG;
#删除表IG中的索引id_name_idx
索引的两面性
优点:提高查询效率
缺点: 修改了数据,MySQL会去修改索引,导致MySQL性能下降。维护索引的开销是比较大的