分页查询SQL优化

  • 一、问题背景
  • 二、优化思路
  • 三、进一步
  • 四、总结

一、问题背景

在数据库中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦。

当一个表数据有几百万的数据的时候成了问题!

如 * from table limit 0,10 这个没有问题
当 limit 200000,10 的时候数据读取就很慢
limit10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,而性能的问题就在这里。

二、优化思路

上面分页语句 limit10000,20,前面扫描出的10000都是浪费的,有没有办法避免这种浪费

参考如下SQL语句(PG数据库)

--查询10条记录,即500-510,由于排序了,最后一条ltp_id为6de468ef-d781-431b-ae4e-0edb96fb371d/odu/ochttp_bi-1/11/0/10
select * from ltp_basic_info order by ltp_id limit 10 offset 500;--再查询10条记录,即510-520
select * from ltp_basic_info order by ltp_id limit 10 offset 510;--再查询10条记录,即510-520,优化后的语句
select * from ltp_basic_info where ltp_id>'6de468ef-d781-431b-ae4e-0edb96fb371d/odu/ochttp_bi-1/11/0/10'  order by ltp_id  limit 10;

基本思路 是借助了排序和比较,一次性过滤到不需要的数据

三、进一步

当分页查询里,增加了过滤条件时,则上面的优化则会失效,数据不连续。

select * from ltp_basic_info where ltp_id like '6%' order by ltp_id limit 10 offset 20;

这个同样会扫瞄之前多余的10条全量数据,一个优化手段如下,先只查询ltp_id

select * from (select ltp_id from ltp_basic_info where ltp_id like '6%' order by ltp_id limit 10 offset 20) tempId left join ltp_basic_info b on tempId.ltp_id=b.ltp_id;

四、总结

  • 当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢,你需增加order by,并且order by字段需要建立索引
  • 如果使用子查询去优化LIMIT的话,则子查询必须是连续的,某种意义来讲,子查询不应该有where条件,where会过滤数据,使数据失去连续性。

参考:https://www.cnblogs.com/azhaozhao/articles/15080807.html

分页查询的SQL优化相关推荐

  1. 千万级别数据查询优化_MySQL大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  2. mysql一样的查询在我本地很快但是线上很慢_MySQL大数据量分页查询方法及其优化...

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  3. MySQL 和 Oracle 大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...

  4. oracle 亿级数据分页,oracle分页查询千万级优化-Oracle

    oracle分页查询千万级优化,在做比对项目时,有表是3千万多的数据,在页面做分页查询时很卡40s,反正差不多一分钟的时间,后来更了sql,优化了代码就好了很多,4s就可以了. 代码里优化是把总条数存 ...

  5. MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)

    摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了 ...

  6. MySQL分页查询方法及优化

    MySQL分页查询方法及优化 http://uusama.com/458.html

  7. mybatis mysql 分页sql语句_MySql实现分页查询的SQL,mysql实现分页查询的sql语句(转)...

    http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...

  8. java mysql 分页查询_MySQL分页查询方法及优化

    当数据库的数据量很大时,一次性查询结果就会变得很慢,为了提高查询效率,我们可以使用MySQL的分页查询功能.本文就为大家带来MySQL分页查询方法及优化. 推荐阅读: 分页查询方法: 在MySQL中, ...

  9. oracle查询实现分页,Oracle实现分页查询的SQL语法汇总

    本文实例汇总了Oracle实现分页查询的sql语法,整理给大家供大家参考之用,详情如下: 1.无ORDER BY排序的写法.(效率最高) 经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据 ...

最新文章

  1. (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT
  2. Yii AR Model 查询
  3. python给生活带来哪些改变_你们觉得python简单么?真的能给生活带来更多机遇么?或者说某些改变?...
  4. opencv机器学习线性回归_Python机器学习之?线性回归入门(二)
  5. saltstack之keepalived的安装配置
  6. 1701. Ostap and Partners(并查集-关系)
  7. CentOS7设置中文字符集
  8. 通过asp.net 短信猫发短信
  9. PhpStorm下Laravel代码智能提示
  10. 5.6 Transformer-XL讲解 意境级
  11. Mosets Tree开发笔记
  12. log nginx 显示时间_【日常小知识系列01】Nginx日志简述
  13. 创建可维护的自动化验收测试
  14. vs2008 sp1补丁安装到最后一点点的时候,就无法安装下去了 解决方法[转]
  15. 如何自己编写一个交通仿真软件(一)火种
  16. html5版堆糖,堆糖(Duitang)
  17. 全文 40000 字,最强(全) Matplotlib 实操指南
  18. 一篇文章搞懂php文件系统基本操作
  19. 浅析嵌入式系统的发展趋势
  20. 古诺的寡头模型—寡占的斯塔克伯格模型

热门文章

  1. Docker 核心技术与实现原理,这篇写得比较清楚
  2. 关闭office Skype for business 自启动 ---> win7【亲测可用,可供参考】
  3. python清除所有变量_python清除变量
  4. mycat mysql 性能测试_mycat读写分离性能测试
  5. 《当代教育科学(原:山东教育科研)》投稿经验分享
  6. /etc/inittab,/etc/init.d/rcS和/etc/profile分析
  7. 对于技术术语专业化的思考
  8. 思科三层交换机配置SVI 实现VLAN 间路由
  9. 经典非对称加密算法:RSA算法原理、实现详解(C++、Java)
  10. 怎么更改锁定计算机背景图片,Win7系统怎么更改锁屏壁纸?注册表如何修改锁屏壁纸?...