参考网址1:https://www.cnblogs.com/nightOfStreet/p/9647926.html           -------------修改需求

一、与产品商讨 修改需求

后端工程师,在接到分页list需求的时候,内心是这样的

画面是这样的

代码大概是这样的select count(id) from …       查出总数

select * from …. limit m,n    查出分页数据

和前端的交互是这样的你传给我查询条件和pageNum、pageSize

我给你返回total、resultList

恩,可以开始预估开发时间了

结果出来的时候是这样的

在点击后面几页的时候发现数据加载很慢。不好,一开始没想到数据量是这个级别的,慢SQL监控已经开始预警

定位到原因有两个

select count(*) 总量会扫全表

limit m,n 当偏移量m很大的时候,查询每次都要先扫到m条满足条件的记录

其他人一定也遇到过这个问题,打开百度还没开始搜索就找到了一个解决方案,百度是这样做的

(正解)我去,这不是耍流氓吗

没有总数,就不需要count,第一个问题解决

limit m,n 百度出来的解决方案都是加一个唯一标识去记录上一次查询的记录在哪里

百度这种做法是搜索引擎自带的分页,不过mysql分页同样可以借鉴,找来产品大大沟通一发“面对这么多的数据,只要把新的数据放到前面,用户不会care后面的数据,是不是可以把页码干掉”

“ 用户也不会管我们到底有多少条记录,来这里也只是做检索而已,总数也可以去掉的,如果要统计数据量我们再单独统计”

。。。理由还可以有很多,产品大大还是很好说话的

最后设计出来是这样的

代码实现是这样的

id是自增主键

select * from … where id > y order by id limit n (向下翻页)

select * from … where id < y order by id desc limit n (向上翻页)

和前端的交互是这样的

你告诉我是向上翻页还是向下翻页,给我当前页第一条(上一页)或者最后一条(下一页)记录的id

我给你数据数据

总结重点是在传统分页方案上遇到的两个问题

select count(*) 总量会扫全表

limit m,n 当偏移量m很大的时候,查询每次都要先扫到m条满足条件的记录

解决方案是产品和技术共同确认的结果,如果产品不接受,此方案不可行

实际开发中还会碰到的问题上一页/下一页、没有数据的处理方式

查询自身带有排序条件,需要order by多字段

参考网址2:https://www.cnblogs.com/icebutterfly/p/9199202.html

二、优化sql查询语句

1.子查询优化法

先找出第一条数据,然后大于等于这条数据的id就是要获取的数据

缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性

实验下

mysql> set profi=1;

Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from Member;

+———-+

| count(*) |

+———-+

|   169566 |

+———-+

1 row in set (0.00 sec)

mysql> pager grep !~-

PAGER set to ‘grep !~-‘

mysql> select * from Member limit 10, 100;

100 rows in set (0.00 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100;

100 rows in set (0.00 sec)

mysql> select * from Member limit 1000, 100;

100 rows in set (0.01 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100;

100 rows in set (0.00 sec)

mysql> select * from Member limit 100000, 100;

100 rows in set (0.10 sec)

mysql> select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100;

2.倒排表优化法

倒排表法类似建立索引,用一张表来维护页数,然后通过高效的连接得到数据

缺点:只适合数据数固定的情况,数据不能删除,维护页表困难

3.反向查找优化法

当偏移超过一半记录数的时候,先用排序,这样偏移就反转了

缺点:order by优化比较麻烦,要增加索引,索引影响数据的修改效率,并且要知道总记录数

,偏移大于数据的一半

引用

limit偏移算法:

正向查找: (当前页 – 1) * 页长度

反向查找: 总记录 – 当前页 * 页长度

mysql百万级数据分页查询缓慢优化方法

标签:维护   一个   image   width   第一条   com   建立   des   预警

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://www.cnblogs.com/gaojr/p/12485215.html

mysql百万数据 查总数都特别慢_mysql百万级数据分页查询缓慢优化方法相关推荐

  1. MySQL百万级数据分页查询及优化

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:https://www.cnblogs.com/geningchao 关注我,回复口令获取可获取 ...

  2. db2分页查询语句优化_面试官:数据量很大,分页查询很慢,怎么优化?

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些 ...

  3. db2分页查询语句优化_数据量很大,分页查询很慢,该怎么优化?

    点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...

  4. 30种MySQL查询语句优化方法分享

    30种MySQL查询语句优化方法分享,对于MySQL查询语句来说效率是最重要的能用一分钟搞定的绝不能花费两分钟.今天整理了30种MySQL查询语句优化方法,供大家学习使用. 30种MySQL查询语句优 ...

  5. mysql插入多行数据来自另一张表_mysql从一张表查询批量数据并插入到另一表中的完整实例...

    说在前面 nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码. 最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中. 说到批量操作,让人最 ...

  6. 百万数据报表导出:使用SXSSFWorkbook完成百万数据报表打印

    在原有代码的基础上替换之前的XSSFWorkbook,使用SXSSFWorkbook完成创建过程即可 /*** 当月人事报表导出* 参数:* 年月-月(2018-02%)*/ @RequestMapp ...

  7. 数据查询分页显示的优化方法

    现有方法: 开始时间 [@start_dt ]   结束时间 [@end_dt ] 其它条件 [      ] 查询数据总量:[XXXX] 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  8. Mysql中分页查询两个方法比较

    mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1; SELECT a FROM f ...

  9. mysql模糊查询的优化方法--亲自实践

    数据有4W多条,不多,但是模糊查询 起来特别慢. 1,尝试过用 select * from (select * from a union all select * from b...很多表union) ...

最新文章

  1. bootstrap4简单使用和入门01-简单表单的使用
  2. 2007 China MVP Open Day
  3. GetModuleHandle,AfxGetInstanceHandle使用区别
  4. SAP UI5 CreateBindingContext 方法的实现逻辑
  5. 如何快速弄懂一个新模型_如何评估创业项目是否靠谱?一个新的模型 | 创创锦囊...
  6. Jquery Datatable的使用样例(ssm+bootstrsp框架下)服务器端分页
  7. 社区发现 实践_实践社区可以为您的组织做什么
  8. transform,translate,transition 的区别
  9. spark如何进行聚类可视化_利用spark做文本聚类分析
  10. 中国志愿者服务器注册,如何注册成为志愿者?中国志愿服务网注册流程
  11. [Keil][Verilog][微机原理] 流水灯、存储器、外部中断实验_北京邮电大学计算机原理与应用课程实验报告
  12. android mp3 wav转换工具,音频提取转换工具app
  13. sfc /scannow扫描修复系统文件命令怎么用_马立杰_新浪博客
  14. 应用编程课程4.系统IO和标准IO的比较,自己做的一些理解,仅仅方便自己看
  15. 小王子(LCA的运用)
  16. 一体化伺服电机外接制动电阻线如何接
  17. 【油猴脚本】改变网页代码块的字体样式/美化LeetCode代码文字显示(CSS;设置@font-face和font-family)
  18. 波导理论(一)规则金属波导一般解法
  19. 国密sm2公钥加密 私钥解密java代码实现
  20. 数据的流动——计算机是如何显示一个像素的

热门文章

  1. 互联网创业需要注意了!
  2. 与国同庆--单片机小白自制蓝牙避障小车
  3. Linux离线安装java
  4. server数据库标记为可疑 sql_sqlserver2008数据库被标记为可疑的解决方法.docx
  5. 华工计算机组成原理第一次作业,华工网络教育学院2018计算机组成原理作业
  6. DELL R720服务器4块sas硬盘组成raid5扩容导致的数据丢失如何恢复
  7. signature=b8b7708fbcb2dc05aab2f56dfec583f5,ゲームアップデート内容
  8. 解决mac端VLC媒体库拖入具有多个文件的N多视频后就会卡死,或者cpu占用颇高的问题
  9. Cesium 鼠标事件监听
  10. java disconnect_Java HttpResponse.disconnect方法代码示例