当前位置: 首页 > news >正文

从深分页查询到覆盖索引

最近看到一道面试题,如何优化深分页查询
最简单的例子是

select  * from web_bill_main
limit 30000,10;

分页达到30000行,需要把前面29999行都过滤掉,才能找到这10条数据
所以整体时间花了80ms(工具显示时间)

我当时的第一反应是,使用in

select * from web_bill_main 
where id in 
(select id from web_bill_main limit 30000,10)

很遗憾,报错了
在这里插入图片描述

然后想到使用left join

select w.* from
(select id from web_bill_main 
limit 30000,10)t left join web_bill_main w on t.id = w.id

速度提升至15ms

正当我洋洋得意时,发现问题的不对劲,速度是提升了,但是返回数据不一样

此时我发现,以下两个sql返回数据的id不一致

select id from web_bill_main
select  * from web_bill_main

select * from web_bill_main查询到的是根据ID进行排序的数据
select id from web_bill_main查询出来的ID并不有序

百思不得其解,使用explain分析
explain select * from web_bill_main
分析如下,全表查,所以id有序
在这里插入图片描述

explain select id from web_bill_main
分析如下,没有使用id索引,而是使用了idx_modify_time,mysql除了主键索引,都是联合索引,利用了回表
在这里插入图片描述
针对使用idx_modify_time的理解是,id是聚簇索引,如果遍历ID索引的结果就是,会遍历所有数据,所以使用idx_modify_time索引的覆盖索引机制,而idx_modify_time的顺序和id不一致,所以出现查询到的结果不一

最终,改成如下sql,数据与原数据一致

select w.* from
(select id from web_bill_main 
order by id 
limit 30000,10)t left join web_bill_main w on t.id = w.id

耗时29ms
在这里插入图片描述

http://www.lryc.cn/news/33937.html

相关文章:

  • Go语言学习的第三天--下部分(Gin框架的基础了解)
  • JDK的动态代理(powernode 文档)(内含源代码)
  • 第1章 多线程基础
  • Linux基本指令(一)
  • el-dialog子组件在mounted周期内获取不到dom?
  • 第九章 opengl之光照(光照贴图)
  • JDK动态代理(powernode CD2207 video)(内含教学视频+源代码)
  • 【Linux】Sudo的隐晦bug引发的一次业务问题排查
  • Java VisualVM 安装 Visual GC 插件图文教程
  • 【C语言】详解静态变量static
  • SpringBoot整合ElasticSearch实现模糊查询,排序,分页,高亮
  • YARN基本架构
  • 【C++复习】类和对象全知识点总结
  • 基于轻量级YOLOv5开发构建汉字检测识别分析系统
  • leetcode-每日一题-66(简单题,数组)
  • LeetCode295之数据流的中位数(相关话题:优先队列)
  • 助你加速开发效率!告别IDEA卡顿困扰的性能优化技巧
  • Java设计模式-适配器模式
  • Linux 练习六 (IPC 管道)
  • 合并两个有序链表(精美图示详解哦)
  • 33 JSON操作
  • 三八妇女节快乐----IT女神活动随笔
  • 【PSO-PID】使用粒子群算法整定PID参数控制起动机入口压力值
  • 当代数据分析指南:激发商业洞见的七个方法(上)
  • javaWeb核心02-JSP、EL、JSTL、MVC
  • spring-boot+mybatis-plus连接Oracle数据库,及查询相关数据
  • 电商使用CRM系统有什么好处,如何选择
  • Nacos2.2.0多数据源适配oracle12C-修改Nacos源码
  • 第十四届蓝桥杯三月真题刷题训练——第 5 天
  • 大数据框架之Hive:第3章 DDL(Data Definition Language)数据定义