当前位置: 首页 > 后端技术 > Java

InnoDB学习(八)聚簇索引

时间:2023-04-01 22:58:03 Java

InnoDB,表数据文件本身就是一个以主键索引的B+树,树的叶子节点存储表数据。这种索引树称为表的聚簇索引。聚簇索引又称为聚簇索引、聚簇索引、聚簇索引,聚簇索引决定了表中数据的物理顺序。InnoDB聚簇索引InnoDB表主键InnoDB中的每张表都有一个主键,表中的每一行数据都按照主键的顺序存储在聚簇索引中。InnoDB中确定一行数据的主键有两种方式:公式声明:用户在建表时可以通过主键关键字声明主键列;uniqueindex:如果用户没有声明主键列,那么InnoDB会使用第一个非空的unique列作为主键;自动生成:如果满足以上两个条件的列不存在,InnoDB将使用RowId作为主键;聚簇索引示例首先,我们在数据库中创建一张用户表,包括用户ID、姓名、性别、年龄四个字段:createtableuser_info(idintprimarykey,ageintnotnull,namevarchar(16),sexbool)engine=创新数据库;向数据库中插入以下数据:用户ID123456789姓名陈二张三李四王吴赵刘孙启周后记吴九正石性别男女男男男男男年龄51020283556258090插入指定数据后进入上表,得到的聚簇索引结构如下:可以看到聚簇索引的叶子节点包含了所有的数据,所以当需要查询一行数据的所有列时,查询效率通过聚集索引是最高的。非聚集索引在InnoDB中,除了聚集索引外,其余的索引都可以称为非聚集索引。非聚集索引的叶子节点存储的是主键索引,而不是所有数据。通过非聚集索引查找数据,其过程是先通过非聚集索引找到数据的主键,然后通过主键找到对应的数据。对于上面的user表,我们稍微修改一下建表语句,为用户的年龄增加一个索引:createtableuser_info(idintprimarykey,ageintnotnull,namevarchar(16),sexbool,key(age))引擎=InnoDB;向表中插入与上述相同的数据,InnoDB会为这张表生成两棵索引树:用户ID对应的聚簇索引树和用户年龄对应的非聚簇索引树。结构如下图所示。从图中可以看出,聚簇索引与非聚簇索引最大的区别在于叶子节点存储的内容。聚集索引的叶子节点存储数据库一行中的所有数据,而非聚集索引的叶子节点存储数据。的主键。大多数情况下,通过非聚集索引找到主键值后,还需要通过聚集索引通过主键值查找整行数据,从而得到所有符合条件的数据。因此,非聚集索引的查询速度总是比聚集索引慢。如果在日常开发中可以使用聚集索引,那么应该尽量使用聚集索引。回表查询所谓回表查询,就是在通过非聚集索引查询数据时,可能需要返回聚集索引再次查询数据。针对以上数据,执行如下SQL语句,查询过程如下图中绿色路径所示。从图中可以看出,用户年龄索引树的叶子节点包含了用户的主键ID。由于我们需要获取用户的所有信息,所以我们还需要根据用户ID通过聚类索引来查找用户的所有信息。.从年龄=5的用户信息中选择*;覆盖索引如果在某次查询中,查询所需的数据可以在非聚集索引中得到,那么就不需要返回聚集索引查询该行中的所有数据。这种情况称为覆盖索引。我们可以修改上面的SQL查询回表为:selectidfromuser_infowhereage=5;由于age索引树的叶子节点中包含了id信息,因此InnoDB不需要再回到聚簇索引中再次查询用户id,而是直接返回age索引树中的id。本文首发于微信公众号,版权所有,禁止转载!