索引
聚簇索引:能确定数据存储顺序的一种索引;
非聚簇索引:索引的逻辑顺序与磁盘上行的物理存储顺序不同;
mysql中主索引聚簇索引就是主键或者非空唯一列,如果这些都没有就会使用内部的rowid列作为聚簇索引。
主索引:一般认为只有主键才是主索引;
辅助索引:也叫二级索引,主索引外的都是辅助索引;
innodb里聚簇索引就是主索引,其他都是辅助索引;myisam里就没有聚簇索引这一说了,所以如果定义了主键就是主索引,其他索引是辅助索引;
存储
innodb:1.innodb 必须有聚簇索引;
2.聚簇索引是B+tree实现,数据存储在聚簇索引的叶子节点;
3.非聚簇索引也是B+tree实现,存储的是聚簇索引的值;
myisam :1.myisam的索引都是非聚簇索引;
2.索引也都是B+tree实现的,叶子节点存储的是数据行的物理地址;
3.主索引跟辅助索引没有什么区别;
接下来放几张别人的图
myisam的主键索引图: myisam的主键索引跟辅助索引没区别 所以一张图代表了
innodb的主键索引跟辅助索引图:
对比总结
1.innodb的聚簇索引存储了实际数据,所以根据聚簇索引查询会非常快。
但是辅助索引存储的是主键索引的值,所以需要去聚簇索引里再查一遍,这就是“回表”,
避免回表的办法就是“索引覆盖” ,即给查询字段建立联合索引,这样辅助索引里就能包含要查询的所有字段,就不需要再回表;
2.innodb里由于辅助索引存储的是聚簇索引的值,所以聚簇索引不宜过大;另外聚簇索引最好选择整型自增主键实现,这样可以保证数据的顺序插入,避免频繁页分裂;