索引
索引 列 在MySQL 中也叫做“键( key )”, 索引 是存储引擎用于快速找到记录的一种数据结构。
- 索引大大减少了服务器需要扫描的数据量。
- 索引可以帮助服务器避免排序和临时表。
- 索引可以将随机I/O 变为顺序 I/O 。
索引的本质是空间换时间 ,通过索引这个缓存来提高数据查询的效率。 在MySQL 中, 每一个索引在InnoDB 里面对应一棵 B+ 树, 即 MySQL 的 InnoDB 索引数据结构是 B+ 树,主键索引叶子节点存储的就是 MySQL 的 整个 数据行,普通索引的叶子节点存储的是 索引列和 主键值。
聚簇索引 vs 非聚簇索引
从物理存储角度来分,索引可以分为聚簇索引和非聚簇索引,区别主要看叶子节点存了什么数据 。
- 聚簇索引:在InnoDB 里,索引 B+Tree 的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引 , 因为数据一旦存储,顺序只能有一种。找到了索引就找到了需要的数据,那么这个索引就是聚簇索引,所以主键就是聚簇索引,修改聚簇索引其实就是修改主键。
- 非聚簇索引:索引B+Tree 的叶子节点只存储了主键的值 和索引列的是非主键索引,也被称之为非聚簇索引。一个表可以有多个非聚簇索引 。 非聚簇 索引的存储和数据的存储是分离的,也就是说可能找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引也叫做辅助索引。
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。
聚簇索引查询相对会更快一些,因为主键索引树的叶子节点直接就是我们要查询的整行数据了 , 而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询(这个过程叫做回表 , 也就是查了2 个索引树)。
总结
主键一定是聚簇索引, 如果开发人员不手动设置主键 , 那么MySQL会默认使用非空的 Unique索引, 若没有非空的Unique 索引,则会使用数据库内部的一个行的id来当作主键索引 , 其它普通索引需要区分SQL场景,当 SQL查询的列就是索引本身时,我们称这种场景下该普通索引也可以叫做聚簇索引, MyisAM引擎没有聚簇索引。
|