索引
MySQL索引是一种用于提高查询性能的数据结构。它为数据库表中的列创建了一个索引,可以快速访问表中的数据。索引可以像快速查找电话簿中的人名一样,根据指定的关键字快速查找表中的数据。
聚簇索引
聚簇索引是一种特殊类型的索引,它为表中的数据提供了物理排序。在聚簇索引中,表中的数据按索引键的值有序存储,并且索引中的项包含表中的完整数据行。这意味着,如果您在表中插入、更新或删除一行数据,索引中的数据也会相应地更新。
如上图所示,叶子节点中存储了全部元素的索引,就是聚簇索引。 一般主键索引就是聚簇索引,如果表中没有主键,MySQL也会默认建立一个隐藏主键做主键索引。
非聚簇索引
非聚簇索引是一种常见类型的索引,它为表中的数据提供了逻辑排序。在非聚簇索引中,表中的数据按照物理顺序存储,而索引中的项仅包含索引键的值和指向表中数据的指针。这意味着,如果您在表中插入、更新或删除一行数据,索引中的数据不会受到影响。
如上图所示,叶子节点中只存储了索引键,其余数据会在另一份文件单独维护,这就是非聚簇索引。
索引常见问题
最左匹配原则
最左匹配原则是一种在查询中使用索引的方式,它要求查询中的每个字符都必须与索引中的最左边的字符完全匹配,才能使用该索引。
例如,假设有一个名为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在执行查询时,仅使用索引中的数据,而不必访问表中的完整数据行。这可以显著降低查询的执行时间,提高性能。
假设有一个数据表,其中包含三列:ID、Name和Age。我们想要查询表中所有年龄大于30岁的人的id。我们可以在Age列上建立索引,然后执行如下查询语句:
SELECT id FROM table WHERE Age > 30;
基于我们前置知识聚簇索引结构知道,在age索引里是有id信息的,这就是索引覆盖,那么如果是要查询年龄大于30岁的人的所有信息:
SELECT * FROM table WHERE Age > 30;
由于age索引上只有id的信息,我们拿到id还要进行二次回表去id索引里找剩余信息,这就是回表。
索引下推
索引下推是一种数据结构优化技术,它通过在数据库中建立索引来提高查询效率。索引下推技术能够帮助数据库引擎在执行查询时减少搜索的数据量,从而提高查询的性能。通常情况下,使用索引下推技术后,数据库的查询速度会提高很多倍。
还是以刚刚数据不为例子,其中包含三列:ID、Name和Age,现在在age和name上建立一个联合索引,然后执行下面查询语句
select * from user where age = 18 and name = '张三';
- 在没有索引下推的情况下,会先把age=18的记录查出来,然后拿着id去进行回表查询,然后在筛选name=张三的数据。
- 在有索引下推的情况下,会先匹配age=18的数据,然后在匹配name=张三的数据,然后在拿着id去进行回表查询。
这样做的好处是可以减少搜索的数据量。