聚簇索引和非聚簇索引的区别

索引存储在磁盘,不同的存储引擎的存储时不同的。
Innodb的存储引擎数据文件跟索引文件全部存储到ibd文件中,而myisam的数据文件存放在myd文件中,索引放在myi文件中,其实区分聚簇索引和非聚簇索引非常简单,只要判断数据跟索引是都存储在一起就可以了。

innodb存储引擎在进行数据插入的时候,数据必须跟索引放在一起,如果有主键就使用主键,没有主键就使用唯一键,没有唯一键就是用6字节的rowid,因此跟数据绑定在一起的就是聚簇索引,而为了避免数据冗余存储,其他的索引叶子节点中村塾的都是聚簇索引的key值,因此innodb中既有聚簇索引也有非聚簇索引,而myisam只有非聚簇索引。

.frm 存储的是表结构。

覆盖索引

再来看看什么是覆盖索引,有下面三种理解:

  • 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
  • 解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫 做覆盖索引。
  • 解释三:是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。

不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引。