Mysql索引的一些事

126 阅读4分钟

索引

MySQL索引是一种用于提高查询性能的数据结构。它为数据库表中的列创建了一个索引,可以快速访问表中的数据。索引可以像快速查找电话簿中的人名一样,根据指定的关键字快速查找表中的数据。

聚簇索引

聚簇索引是一种特殊类型的索引,它为表中的数据提供了物理排序。在聚簇索引中,表中的数据按索引键的值有序存储,并且索引中的项包含表中的完整数据行。这意味着,如果您在表中插入、更新或删除一行数据,索引中的数据也会相应地更新。

image.png 如上图所示,叶子节点中存储了全部元素的索引,就是聚簇索引。 一般主键索引就是聚簇索引,如果表中没有主键,MySQL也会默认建立一个隐藏主键做主键索引。

非聚簇索引

非聚簇索引是一种常见类型的索引,它为表中的数据提供了逻辑排序。在非聚簇索引中,表中的数据按照物理顺序存储,而索引中的项仅包含索引键的值和指向表中数据的指针。这意味着,如果您在表中插入、更新或删除一行数据,索引中的数据不会受到影响。

image.png 如上图所示,叶子节点中只存储了索引键,其余数据会在另一份文件单独维护,这就是非聚簇索引

索引常见问题

最左匹配原则

最左匹配原则是一种在查询中使用索引的方式,它要求查询中的每个字符都必须与索引中的最左边的字符完全匹配,才能使用该索引。
例如,假设有一个名为user的表,其中包含用户的信息,并且想根据用户的姓氏来查询数据。创建一个名为last_name的索引,并使用如下查询语句

SELECT * FROM user WHERE last_name = 'zs';

上面的查询将使用索引last_name,因为它满足最左匹配原则。然而,如果使用了如下查询语句:

SELECT * FROM user WHERE last_name like '%zs';

将不会使用索引last_name,因为它不满足最左匹配原则。在这种情况下,MySQL必须扫描表中的所有行,并检查每一行是否包含以zs结尾的,这会导致查询性能降低。

索引覆盖和回表查

索引覆盖是一种优化查询性能的技术,它允许MySQL在执行查询时,仅使用索引中的数据,而不必访问表中的完整数据行。这可以显著降低查询的执行时间,提高性能。
假设有一个数据表,其中包含三列:IDNameAge。我们想要查询表中所有年龄大于30岁的人的id。我们可以在Age列上建立索引,然后执行如下查询语句:

SELECT id FROM table WHERE Age > 30;

基于我们前置知识聚簇索引结构知道,在age索引里是有id信息的,这就是索引覆盖,那么如果是要查询年龄大于30岁的人的所有信息:

SELECT * FROM table WHERE Age > 30;

由于age索引上只有id的信息,我们拿到id还要进行二次回表去id索引里找剩余信息,这就是回表。

索引下推

索引下推是一种数据结构优化技术,它通过在数据库中建立索引来提高查询效率。索引下推技术能够帮助数据库引擎在执行查询时减少搜索的数据量,从而提高查询的性能。通常情况下,使用索引下推技术后,数据库的查询速度会提高很多倍。
还是以刚刚数据不为例子,其中包含三列:IDNameAge,现在在age和name上建立一个联合索引,然后执行下面查询语句

select * from user where age = 18 and name = '张三';
  • 在没有索引下推的情况下,会先把age=18的记录查出来,然后拿着id去进行回表查询,然后在筛选name=张三的数据。
  • 在有索引下推的情况下,会先匹配age=18的数据,然后在匹配name=张三的数据,然后在拿着id去进行回表查询。

这样做的好处是可以减少搜索的数据量。