位置: 编程技术 - 正文

MYSQL分页limit速度太慢的优化方法(mysql 高效分页)

编辑:rootadmin

推荐整理分享MYSQL分页limit速度太慢的优化方法(mysql 高效分页),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql分页显示,mysql分页实现,mysql分页显示,mysql分页问题,mysql分页显示,mysql分页写法,mysql 分页越来越慢的原理,mysql分页写法,内容如对您有帮助,希望把文章链接给更多的朋友!

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

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

如 * from table limit 0, 这个没有问题 当 limit , 的时候数据读取就很慢,可以按照一下方法解决 第一页会很快 PERCONA PERFORMANCE CONFERENCE 上,来自雅虎的几位工程师带来了一篇”EfficientPagination Using MySQL”的报告 limit,的意思扫描满足条件的行,扔掉前面的行,返回最后的行,问题就在这里。 LIMIT , 扫描了万多行,怪不得慢的都堵死了。 但是 limit 这样的语句仅仅扫描行。

那么如果我们之前记录了最大ID,就可以在这里做文章

举个例子

日常分页SQL语句 select id,name,content from users order by id asc limit , 扫描行 如果记录了上次的最大ID select id,name,content from users where id> order by id asc limit 扫描行。 总数据有万左右 以下例子 当时候 select * from wl_tagindex where byname='f' order by id limit , 执行时间是 3.s 优化后:

执行时间为 0.s 速度明显提升 这里需要说明的是 我这里用到的字段是 byname ,id 需要把这两个字段做复合索引,否则的话效果提升不明显

MYSQL分页limit速度太慢的优化方法(mysql 高效分页)

总结

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

SELECT id,title,content FROM items WHERE id IN (SELECT id FROM items ORDER BY id limit , );

如果limit语句的offset较大,你可以通过传递pk键值来减小offset = 0,这个主键最好是int类型并且auto_increment

SELECT * FROM users WHERE uid > ORDER BY uid LIMIT 0, ;

这条语句,大意如下:

SELECT * FROM users WHERE uid >= (SELECT uid FROM users ORDER BY uid limit , 1) limit 0, ; 如果limit的offset值过大,用户也会翻页疲劳,你可以设置一个offset最大的,超过了可以另行处理,一般连续翻页过大,用户体验很差,则应该提供更优的用户体验给用户。

limit 分页优化方法

1.子查询优化法 先找出第一条数据,然后大于等于这条数据的id就是要获取的数据 缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性 实验下 mysql> set profi=1; Query OK, 0 rows affected (0. sec) mysql> select count(*) from Member; +———-+ | count(*) | +———-+ | | +———-+ 1 row in set (0. sec) mysql> pager grep !~- PAGER set to ‘grep !~-‘ mysql> select * from Member limit , ; rows in set (0. sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit ,1) limit ; rows in set (0. sec) mysql> select * from Member limit , ; rows in set (0. sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit ,1) limit ; rows in set (0. sec) mysql> select * from Member limit , ; rows in set (0. sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit ,1) limit ; rows in set (0. sec) mysql> nopager PAGER set to stdout mysql> show profilesG *************************** 1. row *************************** Query_ID: 1 Duration: 0. Query: select count(*) from Member *************************** 2. row *************************** Query_ID: 2 Duration: 0. Query: select * from Member limit , *************************** 3. row *************************** Query_ID: 3 Duration: 0. Query: select * from Member where MemberID >= (select MemberID from Member limit ,1) limit *************************** 4. row *************************** Query_ID: 4 Duration: 0. Query: select * from Member limit , *************************** 5. row *************************** Query_ID: 5 Duration: 0. Query: select * from Member where MemberID >= (select MemberID from Member limit ,1) limit *************************** 6. row *************************** Query_ID: 6 Duration: 0. Query: select * from Member limit , *************************** 7. row *************************** Query_ID: 7 Duration: 0. Query: select * from Member where MemberID >= (select MemberID from Member limit ,1) limit 从结果中可以得知,当偏移以上使用子查询法可以有效的提高性能。 2.倒排表优化法 倒排表法类似建立索引,用一张表来维护页数,然后通过高效的连接得到数据 缺点:只适合数据数固定的情况,数据不能删除,维护页表困难 3.反向查找优化法 当偏移超过一半记录数的时候,先用排序,这样偏移就反转了 缺点:order by优化比较麻烦,要增加索引,索引影响数据的修改效率,并且要知道总记录数 ,偏移大于数据的一半 引用 limit偏移算法: 正向查找: (当前页 ? 1) * 页长度 反向查找: 总记录 ? 当前页 * 页长度 做下实验,看看性能如何 总记录数:1,, 每页记录数: 总页数:1,, / = 中间页数: / 2 = 第页 正向查找SQL: Sql代码 SELECT * FROM `abc` WHERE `BatchID` = LIMIT , 时间:1. 秒 反向查找sql: Sql代码 SELECT * FROM `abc` WHERE `BatchID` = ORDER BY InputDate DESC LIMIT , 时间:1. 秒 第页 正向查找SQL: Sql代码 1.SELECT * FROM `abc` WHERE `BatchID` = LIMIT , SELECT * FROM `abc` WHERE `BatchID` = LIMIT , 时间:2. 秒 反向查找sql: Sql代码 1.SELECT * FROM `abc` WHERE `BatchID` = ORDER BY InputDate DESC LIMIT , SELECT * FROM `abc` WHERE `BatchID` = ORDER BY InputDate DESC LIMIT , 时间:1. 秒 注意,反向查找的结果是是降序desc的,并且InputDate是记录的插入时间,也可以用主键联合索引,但是不方便。 4.limit限制优化法 把limit偏移量限制低于某个数。。超过这个数等于没数据,我记得alibaba的dba说过他们是这样做的 5.只查索引法

mysql优化的重要参数 key_buffer_size table_cache MySQL服务器端的参数有很多,但是对于大多数初学者来说,众多的参数往往使得我们不知所措,但是哪些参数是需要我们调整的,哪些对服务器的性能影

mysql主键的缺少导致备库hang住 最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤

mysql同步问题之Slave延迟很大优化方法 一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发。简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提

标签: mysql 高效分页

本文链接地址:https://www.jiuchutong.com/biancheng/347533.html 转载请保留说明!

上一篇:MySQL安全策略(MySQL安全注意事项)(mysql安全性控制语句)

下一篇:mysql优化的重要参数 key_buffer_size table_cache(mysql优化sql有哪些)

  • 进口增值税如何入账
  • 调整税率后增值税发票的开具
  • 企业资产损失税前扣除管理办法2011215号第46条
  • 财产租赁所得怎么计算个人所得税
  • 烟叶税税率是多少2019
  • 怎么知道对方的支付宝账号
  • 印花税滞纳金怎么算
  • 移动话费可以开企业发票吗
  • 企业购买的财产险可以在企业所得税前扣除
  • 固定资产清理属于什么科目
  • 一般纳税人收到专票怎么做分录
  • 企业购进货物暂估入库的会计分录如何处理?
  • 股权转让后的实收资本怎么做账
  • 跨年的管理费用怎么调到主营业务成本里
  • 2021年洗车是不是免增值税
  • 预付账款金额过大的原因
  • 增值税应纳所得额是什么意思
  • 三类不良行为
  • 小规模纳税人未达到起征点的增值税怎么做账
  • 没有进出口权可以做外贸吗
  • 上月开的发票本月作废怎么处理
  • 住宿服务可以开免税吗
  • 工资一直计提但是未发有影响吗
  • 经济作物国家有什么补助吗
  • windows7给c盘扩容
  • 文化事业建设税计税依据是
  • 给客户买的礼品怎么报销
  • PHP:mb_encoding_aliases()的用法_mbstring函数
  • 农产品核定扣除的扣除率是多少
  • 税务登记后每个月交什么钱
  • 海獭妈妈和新生儿的故事
  • 免征企业所得税的有
  • 损益类科目包括利润分配吗
  • 弃置费用预计负债递延所得税怎么处理
  • Vue3通透教程【十四】TS复杂类型详解(一)
  • 企业缴纳职工社保比例的规定
  • php抽象类可以多继承吗
  • echarts中的legend能被监听吗
  • html前端开发教程
  • 固定资产折旧四种方法公式
  • 权益法转成本法非同一控制下为什么不公允
  • 赠送礼品账务处理会计分录
  • 利润表的本月数怎么算
  • 买轿车产生的服务费计入什么科目
  • 运输发票怎么做账
  • 营业外支出影响企业利润吗
  • 员工高工资
  • 零余额账户用款额度年末转入哪个科目
  • 应收贷方余额怎么处理
  • 记账凭证结算方式没出来
  • 国际货运公司支付境外运费
  • 一季度存款
  • 企业所得税国税地税怎么分
  • 年末净利润为负数结转本年利润实例
  • 以前年度的银行手续费发票
  • MySQL数据库中把表中的一个字段重命名
  • sqlserver数据库备份
  • mysql多表查询方式
  • win7系统ie浏览器打不开
  • win7自带截图保存在哪个文件夹
  • Freebsd7.0+Apache2.2+MySQL5+PHP5安装配置
  • centos san
  • 硬盘安装操作系统出现,两个操作系统怎么选择
  • awk统计nginx日志
  • SUSE Linux Enterprise Server 设置IP地址、网关、DNS的方法
  • dghm.exe是什么程序
  • win8怎么打开cmd命令窗口?
  • win7系统怎么设置桌面便签
  • 无法启动.dll
  • 将Bitmap用Base64转码成字符串,再解码回来出现黑色背景的问题原因及解决办法。
  • python与c
  • unity监视器
  • 开发板io口在哪
  • JavaScript获取网页内容
  • 怎么将安卓
  • 企业年金个人缴费比例越高越好吗
  • 超豪华小汽车需要在什么环节纳税
  • 进项名称和销项同一产品不同称呼
  • 为什么非贸易付不了款呢
  • 济南市土地使用税申报表怎样作废
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设