MySQL读书笔记--InnoDB索引

索引的本质是通过某种特定的算法,减少I/O次数,以最快的速度和最少的I/O次数找到指定数据。

在InnoDB中,常见的索引有非聚簇索引(辅助索引),聚簇索引,全文索引,联合索引(多列索引),覆盖索引和哈希索引

哈希索引:在InnoDB中是自适应的,InnoDB存储引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预。详细可以查看这篇文章有关自适应哈希部分 MySQL读书笔记--InnoDB特性

全文索引:暂不介绍

在介绍非聚簇索引(辅助索引),聚簇索引,全文索引,联合索引(多列索引)和覆盖索引之前,我们首先应该了解的是B+树。在InnoDB中,这些索引的实现都依靠B+树这种数据结构。

我想学过MySQL或者其他数据库人都知道。了解它,是我们学习数据库的一个重点。

那么为什么B+树为何如此高效?搜索速度为何如此的快?下面是我总结了几点:

1.B+树索引,具有很高的扇出性,B+树的高度一般在2-4层(千万级数据),所以查找一行键值,最多需要2-4次I/O(一般机械磁盘每秒至少100次I/O,2-4次需要0.02-0.04秒)。

2.B+树索引并不能找到一个给定键值的具体行,而是只能查找到数据行所在的页。然后数据库通过把页读到内存,再在内存中进行查找,最后得到要查找的数据

3.B+树,数据是顺序存放的(逻辑顺序,而不是物理顺序)。

4.B+树,通过二分查找法能够快速的查找的某个值

5.B+树叶子页,节点之间以链表连接,不用每次都从根节点开始查找

好,介绍完了B+树,现在开始介绍MySQL中的索引

    表 t_test (字段由 id,name,age,country...)

    id:聚簇索引

    idx_name 索引1

    idx_name_age  索引2

聚簇索引:说白了就是索引保存了整行的数据,在表中,对于id这个聚簇索引,每行索引值都包含t_test中所有字段值。所以,通过聚簇索引查询,可以直接从索引中获取所需要的数据,而不需要回表查询。

非聚簇索引(辅助索引):这个种索引,相比聚簇索引就是,它不保存整行数据,每个索引行,只保存指定字段数据+主键。例如idx_name 这个索引,每行索引保存的就是 name+id,对于idx_name_age 保存的是 name+age+id。索引通过辅助索引查询数据,如果查询的字段不包含在索引字中,那么MySQL会通过主键ID,回表查询(先通过索引查找,然后通过ID,在聚簇索引中查找数据)

联合索引(组合索引):最鲜明的对比就是 idx_name 和 idx_name_age。 idx_name是单列索引, 而idx_name_age是组合索引。

覆盖索引:所谓覆盖索引,指的是可以直接通过索引查找到所需字段,而不需要通过回表。 聚簇索引是覆盖索引。因为聚簇索引包含所有字段数据。都不需要通过回表查询数据。这样可以大大的加快查询的速度

     SELECT name,age FROM t_test WHERE name=xx and age = xx  这个SQL中,idx_name_age是覆盖索引,因为所需字段只有name,age,而在idx_name_age这个索引中都包含了,所以不需要回表。 

最好我们再说说索引的优点和使用性:

    索引的优点:
      索引大大减少了服务器需要扫描的数据量
      索引可以帮助服务避免排序和临时表
      索引可以将随机I/O变成顺序IO

   索引的使用性:
     对于非常小的表,大部分情况下简单的全表扫描更高效(避免回表)
     对于中到大型的表,索引是非常有效的
     对于特大型的表,建立和使用索引的代价将会随之增大,这种情况,需要一种技术可以之间区分出查询所需要的一组数据,而不是一条记录一条记录的匹配

索引

猜你喜欢

转载自blog.csdn.net/H_L_S/article/details/89276981