1. 索引
在InnoDB存储引擎中,索引分为聚簇索引和辅助索引两种类型。
聚簇索引是指基于表的主键构建的索引,它决定了表中数据的物理存储顺序。也就是说,聚簇索引中的键值按照主键的顺序来排序,并且每个叶子节点存储的是整个表行的数据。因此,通过聚簇索引可以快速地定位到特定主键的行数据,而且相邻的行数据在物理上也是相邻存储的。如果表没有主键,则InnoDB会选择一个唯一的非空索引作为聚簇索引,如果没有这样的索引,则会隐式地创建一个隐藏的主键。
辅助索引是指除了聚簇索引以外的其他索引,它们的叶子节点存储的是主键值和指向对应行数据的指针。因此,通过辅助索引可以快速地定位到符合特定条件的行数据,并且可以使用覆盖索引避免访问聚簇索引中的行数据。辅助索引可以有多个,每个辅助索引都有自己的B+树结构。
需要注意的是,聚簇索引和辅助索引在物理上是相互独立的。如果同时使用多个辅助索引,每个索引都需要单独维护一个B+树结构,这可能会影响写入性能。此外,在使用辅助索引时,需要特别注意覆盖索引和最左前缀索引的使用,以保证查询性能的最大化。
InnoDB必须有一个主键
InnoDB的表为什么必须有一个主键?
聚集索引B+树。
在InnoDB存储引擎中,表中的数据是按照主键索引的B+树结构进行组织的,每行数据对应B+树中的一个叶子节点。这种结构使得InnoDB能够高效地支持基于主键的数据访问和查询操作。
InnoDB中的B+树
B+树:多路平衡搜索树
所有叶子节点都在同一层
叶子节点构成了一个双向链表
结点的大小都是16K
为什么选择B+树?
降低磁盘IO次数,树相对矮胖
便于支持范围查询
索引使用场景(看col所在列是否设置了索引,有就使用)
- where col
- group by col
- order by col
不会使用索引的场景
4. 没有使用上面三个的时候
5. 区分度不高的列
6. 经常修改的列不使用索引(修改的话要改树,维护代价很高)
7. 数据量少的表,没必要创建
2.约束
外键约束
示例如下:
覆盖索引
覆盖索引:一种数据查询方式,针对辅助索引,直接通过辅助索引的B+树就能找到我们要查找的内容,无需再进行回表查询。
覆盖索引是一种特殊的索引,它包含了查询所需的所有列,而不仅仅是索引列。当一个查询可以通过覆盖索引完全满足时,就不需要进行回表查询。
在传统的查询中,当使用非覆盖索引时,数据库需要根据索引找到匹配的行,并通过回表操作去访问主表来获取其他列的值。这个过程会增加额外的磁盘I/O和CPU开销。
相比之下,覆盖索引可以避免回表操作。因为覆盖索引已经包含了查询所需的所有列,数据库可以直接从索引中获取所需的数据,而不需要再次访问主表。这样可以显著提高查询性能,减少了不必要的磁盘I/O和CPU开销。
使用覆盖索引可以有效地减少查询的响应时间,特别是对于那些只需要部分列数据的查询。然而,覆盖索引也有一些限制,例如索引列的长度和数量等。在设计数据库时,需要根据具体的业务需求和查询模式来合理选择是否使用覆盖索引。
尽量不使用select * ,只写我们需要的字段。
最左匹配guize
在MySQL中,最左匹配规则是指当使用复合索引(即包含多个列的索引)进行查询时,MySQL会从左到右依次匹配索引的列,并且只有在前面的列都有匹配条件时,才能使用后面的列进行进一步的筛选。
具体来说,如果创建了一个复合索引 (col1, col2, col3)
,那么在查询时,MySQL将首先尝试使用 col1
进行匹配。只有当查询中包含了 col1
的条件时,索引才会被用到。如果查询中没有 col1
的条件,那么索引将无法使用。
如果查询中有 col1
的条件,MySQL 将根据剩余的条件继续匹配 col2
,然后是 col3
。只有在前面的列都有匹配条件的情况下,才能使用后面的列进行进一步的筛选。
这意味着,如果要充分利用复合索引的最左匹配规则,需要确保查询条件中的列与索引的列按照相同的顺序,并且从左到右逐渐添加条件。
举个例子,假设有一个复合索引 (col1, col2, col3)
,如果查询条件中只有 col2
和 col3
的条件,而没有 col1
的条件,那么该索引将无法使用。因为最左匹配规则要求必须从索引的最左边开始进行匹配。
因此,在设计和优化索引时,了解最左匹配规则对于正确选择索引和编写高效的查询语句是非常重要的。
待续。。。。