为什么80%的码农都做不了架构师?>>>   

mysql分页就直接使用limit进行操作,limit如果我们直接不加任何处理可能数据大了就会很卡的。

一. 最常见MYSQL最基本的分页方式:

select * from content order by id desc limit 0, 10

在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似:

select * from content order by id desc limit 10000, 10

一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。

MYSQL分页性能优化

limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候SQL语句可以是:

SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20;

不管翻多少页,每次查询只扫描20行。

缺点是只能提供”上一页”、”下一页”的链接形式,但是我们的产品经理非常喜欢”<上一页 1 2 3 4 5 6 7 8 9 下一页>”这样的链接方式,怎么办呢?

如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的”clue”做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,比如要跳到第8页,我看的SQL语句可以这样写:

SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20,20;

跳转到第13页:

SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;

还有网友说可以使用子查询来操作

一,子查询的分页方式来提高分页效率,飘易用的SQL语句如下:

代码如下复制代码SELECT * FROM `content` WHERE id <=

(SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT $pagesize

为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。(via)通过explain SQL语句发现:子查询使用了索引!

代码如下复制代码id select_type table type possible_keys key key_len ref rows Extra

1 PRIMARY content range PRIMARY PRIMARY 4 NULL 6264 Using where

2 SUBQUERY content index NULL PRIMARY 4 NULL 27085 Using index

经过飘易的实测,使用子查询的分页方式的效率比纯LIMIT提高了14-20倍!

二,JOIN分页方式

代码如下复制代码SELECT * FROM `content` AS t1

JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2

WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;

经过我的测试,join分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。explain SQL语句:

代码如下复制代码id select_type table type possible_keys key key_len ref rows Extra

1 PRIMARY <derived2> system NULL NULL NULL NULL 1

1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where

2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index


转载于:https://my.oschina.net/Yonney/blog/404061

mysql分页与分页性能查询优化相关推荐

  1. mysql分片库分页查询_mysql数据库分页查询优化

    当数据很多需要进行分页查询时:需要先查出第一条数据的id然后根据id查询大于id的数据 limt 一页的数据量 1.   直接用limit start, count分页语句, 也是我程序中用的方法: ...

  2. mysql limit分页知乎_头发一天天的掉,你知道MySQL的Limit有性能问题吗?

    你知道MySQL的Limit有性能问题吗? MySQL的分页查询通常通过limit来实现. MySQL的limit基本用法很简单.limit接收1或2个整数型参数,如果是2个参数,第一个是指定第一个返 ...

  3. mysql 千万数据分页_MySQL处理千万级数据查询、分页

    MySQL数据库优化处理实现千万级快速分页分析,来看下吧. 数据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, ...

  4. mysql临时表如何分页查询慢_面试官扎心一问:数据量很大,分页查询很慢,有什么优化方案?...

    准备工作 一般分页查询 使用子查询优化 使用 id 限定优化 使用临时表优化 关于数据表的id说明 当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明 ...

  5. MySQL如何实现分页查询

    [转载]MySQL如何实现分页查询 - 知乎 在后端项目中总是避免不了admin管理,当后台管理需要展示数据时就会需要用到分页,接下来在文中中将为大家分享的时MySQL如何实现分页查询,具有一定的参考 ...

  6. 深入剖析-关于分页语句的性能优化

    分页语句是数据库开发和应用场景比较常见的需求,即按照特定的where条件进行过滤,然后在按照一个或者多个条件进行排序(如果不进行排序无法确执行时候无法返回相同的结果),最后取其中的前十行或者几十行. ...

  7. [数据库]Oracle和mysql中的分页总结

    Mysql中的分页 物理分页 •在sql查询时,从数据库只检索分页需要的数据 •通常不同的数据库有着不同的物理分页语句 •mysql物理分页,采用limit关键字 •例如:检索11-20条 selec ...

  8. MySQL中的分页查询

    MySQL中的分页查询 一.MySQL分页查询原则 在MySQL数据库中使用limit子句进行分页查询: MySQL分页中开始位置为0: 分页子句在查询语句的最后侧: 二.Limit子句(较为常 ...

  9. php mysql ajax 分页_ajax+php+mysql无刷新分页代码(1/2)_PHP教程

    ajax+php+mysql无刷新分页代码 ajax+php教程+mysql教程无刷新分页代码 2 3 4投票结果 5 6 7 8 9 function getxmlhttpobject() 10 { ...

  10. jsp import mysql con_jsp的分页查询的代码(mysql数据库)

    [原来没有写过,听朋友说,比较难,就试一下,还是挺简单的,只不过,具体实用方面还得自己写,没有什么难的,自己看看就懂了.bean文件:package bean;/** * jsp+java bea 这 ...

最新文章

  1. mysql (双主,互主)
  2. 微服务:Java EE的拯救者还是掘墓人?
  3. 梁佳玉 - 昨天的爱
  4. 弧形背景html,JS实现带圆弧背景渐变效果的导航菜单代码
  5. openstack运维实战系列(十七)之glance与ceph结合
  6. 成吉思汗:“世界之鞭”还是“人类之王”?
  7. PHY以太网自动协商原理
  8. Skype For Business 2015实战系列14:创建Office Web App服务器场
  9. C++超详细STL常用算法总结
  10. VK Cup 2018 Round 1: A. Primal Sport
  11. java视图扩展_java – 可扩展列表视图 – 子项,不同的布局
  12. C# DateTime的ToString()方法的使用
  13. 用户体验测试一样很重要
  14. Android studio 之 Menu(菜单)
  15. 一个大学生屌丝心中的seo梦
  16. golang学习笔记(进阶篇)
  17. Windows10蓝屏触发及分析
  18. Linux系统中CPU占用率过高问题原因分析
  19. 如何通俗理解信创国产化是什么意思?有哪些系统?有什么意义?
  20. 伪科学、骗科学、错误科学

热门文章

  1. 用源码轻松搭建LNMP !
  2. linux 环境 安装jdk tomcat mysql git
  3. RN中布局样式的写法
  4. BZOJ1068:[SCOI2007]压缩——题解
  5. C/C++中作用域详解(转)
  6. iOS开发拓展篇—CoreLocation简单介绍
  7. hive 添加分区
  8. Deep Learning(深度学习)学习笔记整理系列之(五)
  9. 每天一个linux命令(21):find命令之xargs
  10. 32位系统和64位系统的辨别