MySQL的Innodb存储引擎的索引分为聚集索引和非聚集索引两大类
1.主键是一个特殊的唯一性索引,它可以被设置成聚集索引,也可以被设置成非聚集索引.
一个加了主键的表,他的整个表就变成了一个索引,也就是所谓的聚集索引(聚集索引只能有一个),变成了一个平衡树的结构,而没有加主键的表才是真正的表,它的数据无序的存放在磁盘的存储器上,排列的很整齐.
所以加了索引的表可以大大的提升查询速度,假如有一亿个数据,加了索引了表(假设是有10个节点的二叉树),只需要查询10次,而没有加所用就需要1亿次.而对于增删操作需要维护平衡树的结构,自然变得麻烦一些.
如果一个表的主键是id,那么通过id找就是通过索引的.
sql server 中添加主键的时候,自动给主键所在的字段生成一个聚集索引
2.非聚集索引.
非聚集索引和聚集索引一样,都是以平衡树为数据结构,也就是我们常说的常规索引,树中的叶子节点数据来自于加了索引的字段.假如给name这个字段加了索引,就会把name字段的所有属性单独复制出来,构建一个小的平衡树.就是非聚集索引.
在我们查找的时候,就可以通过非聚集索引查到对应的主键值,再使用主键值通过聚集索引找到我们需要的数据,也就是说聚集索引是通往真实数据的唯一路径.
聚集索引和非聚集索引的区别:
区别就是真实数据和索引是不是在一起,聚集索引存储的是真实数据,数据和索引在一起,而非聚集索引仅仅存储了数据对应的主键.
小tips:
如果非聚集索引也存储了真实数据,这样通过普通索引查询的时候不是更快嘛?
这里其实运用了时间换空间的思想,假如我们的数据很多,每加一个普通索引就要复制一份数据,那么就会很占用空间,所以对于非聚集索引,直接存储主键即可,况且这样也不会浪费多少时间.