0%

索引

image-20200217103408350

innodb

mysql 的 innodb 引擎要求 table 必须包含主键

聚簇索引

在同一个数据结构中,同时保持索引和数据行。

有如下优点:

  • 可以把相关数据保存在一起。例如实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少数的数据页就能获取某个用户的全部邮件。如果没有使用聚簇索引,则每封邮件都可能导致一次磁盘I/O。
  • 数据访问更快。聚簇索引将索引和数据保存在同一个B-Tree中,因此从聚簇索引中获取数据通常比在非聚簇索引中查找要快。
  • 使用覆盖索引扫描的查询可以直接使用页节点中的主键值。

有如下缺点:

  • 二级索引(非聚簇索引)可能比想象的要更大,因为在二级索引的叶子节点包含了引用行的主键列。
  • 二级索引访问需要两次索引查找,而不是一次
  • 插入速度严重依赖于插入顺序。按照主键的顺序插入是加载数据到 InnoDB 表中速度最快的方式。但如果不是按照主键顺序加载数据,那么在加载完成后最好使用OPTIMIZE TABLE命令重新组织一下表。

其他:

  • 二级索引叶子节点保存的不是指向行的物理位置的指针,而是行的主键值
  • 物理主键推荐递增数据。若使用uuid作为主键,会使数据库频繁进行树的平衡。

参考

InnoDB关键特性之自适应hash索引