一、索引分类
1、B+树索引
2、哈希索引
3、全文索引
二、详细介绍索引
一、B+树索引
-
聚集索引/聚簇索引
将表的主键构造为一颗B+树,并将表的行记录存放在B+树的叶子结点上,聚集索引是由mysql自己根据主键创建的索引,如果表中没有主键会根据rowid创建聚集索引。
-
辅助索引/二级索引
叶子结点不包含行的全部数据,只存放了行的id。
-
联合索引
以多个列共同创建索引,叶子结点中包含创建索引的列数据和主键id。联合索引的查询需要遵循最左前缀原则,否则索引失效。最左前缀原则:需要根据创建索引的顺序进行查询,即查询的列要以从左到右的顺序。如下图中,由于索引b的排序是以索引note为基础的,若只以索引列b为查询条件,索引列b中的数据是乱序的,并不查询到准确的数据。 -
回表查询
非聚集索引的叶子结点上并没有存放行的全部数据,只包含建立索引的列数据,若获取的列不在索引的叶子结点中,会进行回表查询。回表查询是根据叶子结点上的主键id,在聚集索引中查询全部数据。
-
覆盖索引
覆盖索引是指可以在辅助索引中得到查询的记录,不需要回表查询,以增加查询效率。
二、Hash索引
mysql会自动建立自适应Hash存放热点数据,提高查询效率。
三、思考
1、回表查询会进行两次查询操作,为什么不在非聚集索引的叶子结点上存放全部行数据呢?
答:每个索引上都存放全部数据,会浪费磁盘空间
2、走索引的查询效率一定比不走索引高吗?
答:不一定、如果表中数据量较少,且走了回表查询,效率可能会低于全表扫描,不过MySQL的查询优化器会选择是否走索引,以达到最大查询效率。