一个表中有且只有一个聚集索引,可以有多个非聚集索引。
聚集索引存储记录是物理上连续存在,物理存储按照索引排序,聚集索引中的叶子节点就是数据节点。
聚集索引的叶子节点称为数据页(16KB)
而非聚集索引是逻辑上的连续,物理存储并不连续,物理存储不按照索引排序。
Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。
索引效率
聚集索引查找>非聚集索引查找>非聚集索引扫描>聚集索引扫描>全表扫描
3.索引建立相关原则
一般在条件列、高选择列、排序或者搜索列上建立索引。
索引顺序一般高选择性列,快速缩小范围。
聚集索引 一般创建在排序列或者,经常进行范围查找的列上。
数据的插入、删除和更改操作,会更新索引信息。相对而言,读较多的表,可以创建较多的索引;而更新较多的表,创建较少的索引。
通过聚集索引可以一次查到需要查找的数据(因为叶子节点,就是真正的数据), 而通过非聚集索引第一次只能查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据(这个过程要回表,非聚集索引叶子节点还是索引,不是数据,这个叶子节点的索引中聚集索引的值,需要根据聚集索引再去查询一次)。
聚集索引一张表只能有一个,而非聚集索引一张表可以有多个。
优缺点
索引能让数据库查询数据的速度上升, 而使写入数据的速度下降,原因很简单的,因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。
聚集索引速度快于 非聚集索引
查询数据用聚集索引占用的内存比非聚集索引少。
Innodb 必须有主键,如果没有手动创建,存储引擎会隐式创建的。innodb肯定有聚集索引
innodb 的非聚集索引,叶子节点存储主键,而myisam 是非聚集索引。叶子节点存储的是myd的地址,所以查询比innodb非聚集索引要快。,可以没有主键,不存在聚集索引。