聚簇索引和二级索引
每张InnoDB表都有一个特殊的索引叫聚簇索引,这个索引指定了数据应该存放在哪里。一般来说,聚簇索引等价于primary key。为了在查询,插入,以及其他操作中取得最优性能,你必须理解InnoDB是如何使用聚簇索引以优化每张表上最常见的查询和DML操作。
-
但你为你的表定义一个PRIMARY KEY后,InnoDB会将它作为聚簇索引。如果表里没有unique且non-null列或者列集合时,可以添加一个自增列作为主键作为聚簇索引。
-
如果你不指定PRIMARY KEY,MySQL会找到第一个UNIQUE且NOT NULL列作为聚簇索引。
-
如果表里没有PRIMARY KEY以及合适的UNIQUE索引,InnoDB会生成一个叫GEN_CLUST_INDEX的隐式的聚簇索引。
聚簇索引是如何加速查询的
因为聚簇索引和它对应的行数数据是放在一起的,查询聚簇索引会直接找到存储数据的页面。如果一张表很大,相对于数据和索引在不同页面的架构,聚簇索引架构经常会节省磁盘I/O操作。
二级索引是如何关联到聚簇索引
除了聚簇索引,其他索引都是二级索引。在InnoDB中,二级索引的每条记录包含主键列,InnoDB用该主键列中的值来在聚簇索引中查找行。
如果主键很长,那么二级索引会占用很多空间,所以短主键是有好处的。