【面试】数据库—优化—覆盖索引、超大分页优化
2023-12-14 17:38:20
数据库—优化—覆盖索引、超大分页优化
1. 覆盖索引概念
覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。
- 下表中
id
为主键,默认是主键索引,name
字段为普通索引:
举例:
select * from tb_user where id = 1 #覆盖索引
select id,name from tb_user where name = ‘Arm’ #覆盖索引
select id,name,gender from tb_user where name = ‘Arm’ #非覆盖索引(需回表查询)
2. 索引覆盖解决超大分页问题
超大分页问题: 在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低
执行limit分页查询耗时对比:
原因: 当在进行分页查询时,如果执行 limit 9000000,10,此时需要MySQL排序前9000010记录,仅仅返回9000000 - 9000010的记录,其他记录丢弃,查询排序的代价非常大。
优化思路:
一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化;
select *
from tb_sku t,
(select id from tb_sku order by id limit 9000000,10) a
where t.id = a.id;
**面试官:** 知道什么叫覆盖索引嘛 ?
**候选人:** 嗯
- 覆盖索引是指select查询语句使用了索引,返回的列,必须在索引中全部能够找到,如果我们使用id查询,它会直接走聚集索引查询,一次索引扫描,直接返回数据,性能高;
- 如果按照二级索引查询数据的时候,返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *,尽量在返回的列中都包含添加索引的字段;
**面试官:** MYSOL超大分页怎么处理 ?
**候选人:**
- 超大分页一般都是在数据量比较大时,我们使用了limit分页查询,并且需要对数据进行排序,这个时候效率就很低,我们可以采用覆盖索引和子查询来解决;
- 先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了;
- 因为查询id的时候,走的覆盖索引,所以效率可以提升很多
文章来源:https://blog.csdn.net/qq_42411696/article/details/134994687
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!