每日一记:索引相关
聚簇索引也叫聚集索引:(聚餐索引是一直存在的,有主键就是主键索引,没主键就是rowid,择优选择个列)
在聚集索引中,B+树上会存储这一行的全部数据,但是非聚集索引只会存储该列对应的值和相应行的主键。
聚簇索引叶子结点存的是数据,普通索引叶子结点存的是聚簇索引的id
1.如果where条件走普通索引了,他会去找聚簇索引的节点,这种普通索引查聚簇索引返回数据的方式称为回表,避免回表就利用覆盖索引(用联合索引解决);
2.有联合索引的话,查的不是*而是某个字段(或者两个),而这个字段刚好在联合索引字段里,那就索引覆盖直接返回数据(联合索引是把联合的列存进叶子结点)
3.聚簇索引叶子结点页16kb,如果是自增主键,那就是依次往后加就行,如果比如是uuid需要往中间插入,浪费资源,所以一般使用自增主键,自增主键还有好处是字段(int4或者bigint8),uuid1632比较大,太浪费资源,自增主键还可以预测,比如你知道10001是主键,那10002,10003是主键,插入多少数据有心里数比较方便
4.rowid一直存在:如果表中有主键,那row就是id,如果表中没有主键,但是表中有唯一键并且类型数值型不为空的条件下,rowid就是当前字段类型,如果上述两种情况都没有,那mysql会默认生成一个6字节的一个指针2^48 ,超过了2^48前面得数据就会被覆盖,或者报错?(自增主键超过int个数会覆盖或者报错?)
所以PK查询非常快,直接定位行记录。