mysql分页查询语句

MySQL分页时使用 limit+order by 会出现数据重复问题

跟風遠走 提交于 2020-04-08 11:44:55
1、问题描述 在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页。但是,当limit遇到order by的时候,可能会出现翻到第二页的时候,竟然又出现了第一页的记录。 SELECT `post_title`, `post_date` FROM post WHERE `post_status` = 'publish' ORDER BY view_count desc LIMIT 5, 5   使用上述SQL查询的时候,很有可能出现和LIMIT 0,5相同的某条记录。而如果使用如下方式,则不会出现重复的情况: SELECT * FROM post WHERE post_status = 'publish' ORDER BY view_count desc LIMIT 5, 5 但是,由于post表的字段很多,仅仅希望用这两个字段,不想把post_content也查出来。为了解决这个情况,在ORDER BY后面使用了两个排序条件来解决这个问题,如下: SELECT `post_title`, `post_date` FROM post WHERE `post_status` = 'publish' ORDER BY view_count desc, ID asc LIMIT 5, 5 按理来说

Mybatis框架插件PageHelper的使用

萝らか妹 提交于 2020-03-31 02:44:58
在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页。 前端分页 一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计算count和分页逻辑,一般前端组件(例如dataTable)会提供分页动作。 特点是:简单,很适合小规模的web平台;当数据量大的时候会产生性能问题,在查询和网络传输的时间会很长。 后端分页 在ajax请求中指定页码(pageNum)和每页的大小(pageSize),后端查询出当页的数据返回,前端只负责渲染。 特点是:复杂一些;性能瓶颈在MySQL的查询性能,这个当然可以调优解决。一般来说,web开发使用的是这种方式。 我们说的也是后端分页。 MySQL对分页的支持 简单来说MySQL对分页的支持是通过limit子句。请看下面的例子。 1 limit关键字的用法是 2 LIMIT [offset,] rows 3 offset是相对于首行的偏移量(首行是0),rows是返回条数。 4 5 # 每页10条记录,取第一页,返回的是前10条记录 6 select * from tableA limit 0,10; 7 # 每页10条记录,取第二页,返回的是第11条记录,到第20条记录, 8 select * from tableA limit 10,10; 这里提一嘴的是

MySQL大数据量分页性能优化

亡梦爱人 提交于 2020-03-21 15:47:08
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from product limit start, count 当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条), 如下: select * from product limit 10, 20 0.016秒 select * from product limit 100, 20 0.016秒 select * from product limit 1000, 20 0.047秒 select * from product limit 10000, 20 0.094秒 我们已经看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟起始页码是有很大关系的,那么我们把起始记录改为40w看下(也就是记录的一般左右) select * from product limit 400000, 20 3.229秒 再看我们取最后一页记录的时间 select * from product limit 866613, 20 37.44秒 难怪搜索引擎抓取我们页面的时候经常会报超时,像这种分页最大的页码页显然这种时 间是无法忍受的。

16、使用limit offset 分页时,为什么越往后翻越慢?如何解决?

两盒软妹~` 提交于 2020-03-21 12:28:03
在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦。 当一个表数据有几百万的数据的时候成了问题! 如 * from table limit 0,10 这个没有问题 当 limit 200000,10 的时候数据读取就很慢,可以按照一下方法解决 第一页会很快 PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”EfficientPagination Using MySQL”的报告 limit10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里。 LIMIT 451350 , 30 扫描了45万多行,怪不得慢的都堵死了。 但是,limit 30 这样的语句仅仅扫描30行。 那么如果我们之前记录了最大ID,就可以在这里做文章 举个例子 日常分页SQL语句 select id,name,content from users order by id asc limit 100000,20 扫描100020行 如果记录了上次的最大ID select id,name,content from users where id>10073 order by id asc limit 20 扫描20行。

mybatis分页插件

若如初见. 提交于 2020-03-15 19:06:59
如果你也在用 Mybatis ,建议尝试该分页插件,这个一定是 最方便 使用的分页插件。 该插件目前支持 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六种数据库分页。 点击提交 BUG 1. 版本说明 1.1. 最新版本为 3.4.2 PageInfo 中的 judgePageBoudary 方法修改: isLastPage = pageNum == pages && pageNum != 1; // 改为 isLastPage = pageNum == pages; 1.2. 版本 3.4.1 重大 bug 修复, SqlParser 解析 sql 失败的时候返回了不带 count(*) 的 sql ,导致查询失败。 产生原因,由于 SqlParser 在系统中出现的位置修改后,导致这里出现错误。 强烈推荐各位更新到最新版本。 增加了对 @SelectProvider 注解方法的支持,不使用这种方式的不影响 对基本逻辑进行修改,减少反射调用和获取 BoundSql 次数 对支持的数据库全部通过完整测试 虽然变化大,但是影响范围小,不特殊通知各位了。 1.3. 版本 3.4.0 2. 使用方法 分页插件项目中的正式代码一共有个 5 个 Java 文件,这 5 个文件的说明如下: Page<E>[ 必须 ] :分页参数类,该类继承

【转】大数据量分页写法

坚强是说给别人听的谎言 提交于 2020-03-07 06:55:45
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from product limit start, count 当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条), 如下: select * from product limit 10, 20 0.016秒 select * from product limit 100, 20 0.016秒 select * from product limit 1000, 20 0.047秒 select * from product limit 10000, 20 0.094秒 我们已经看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟起始页码是有很大关系的,那么我们把起始记录改为40w看下(也就是记录的一般左右) select * from product limit 400000, 20 3.229秒 再看我们取最后一页记录的时间 select * from product limit 866613, 20 37.44秒 难怪搜索引擎抓取我们页面的时候经常会报超时,像这种分页最大的页码页显然这种时 间是无法忍受的。

分页查询

邮差的信 提交于 2020-03-05 12:10:13
在这里主要讲解一下MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法。可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用。 下面就分别给大家介绍、讲解一下三种数据库实现分页查询的方法。 一、 MySQL 数据库分页查询 MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。 LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。例如: select * from table WHERE … LIMIT 10; #返回前10行 select * from table WHERE … LIMIT 0,10; #返回前10行 select * from table WHERE … LIMIT 10,20; #返回第10-20行数据 二、 SQLServer数据库分页查询 SQLServer数据库又分为SQLServer2000和SQLServer2005。一般比较简单的方法是通过TOP函数来实现。如下: SELECT TOP 10 * FROM sql WHERE ( code NOT IN

数据库分页查询

馋奶兔 提交于 2020-03-05 12:09:53
一、 MySQL 数据库分页查询 MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。 LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出 两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第 二个参数指定最多返回行数。 例如: select * from table where ... LIMIT 10; #返回前10行 select * from table where ... LIMIT 0,10; #返回前10行 select * from table where ... LIMIT 10,20; #返回10到20行数据 二、ORCALE数据库分页查询 ORCALE数据库实现分页查询可以使用row_number()函数或者使用rownum 虚列两种方法。 第一种:利用分析函数row_number() 方法 select * from( select t.*,row_number() over (order by t1.id) rowno from TABLE1 t ) where rowno between 21 and 40; 第二种:直接使用rownum 虚列 选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过 ROWNUM <

sql server分页(摘)

时间秒杀一切 提交于 2020-03-03 14:01:41
sqlserver2005不支持关键字limit ,所以它的分页sql查询语句将不能用mysql的方式进行,幸好sqlserver2005提供了top,rownumber等关键字,这样就能通过这几个关键字实现分页。 在网上查阅到的几种查询脚本的写法: 几种sqlserver2005高效分页sql查询语句 top方案: sql code: select top 10 * from table1 where id not in(select top 开始的位置 id from table1) max: sql code select top 10 * from table1 where id>(select max(id) from (select top 开始位置 id from table1order by id)tt) row: sql code select * from ( select row_number()over(order by tempcolumn)temprownumber,* from (select top 开始位置+10 tempcolumn=0,* from table1)t )tt where temprownumber>开始位置 3种分页方式,分别是max方案,top方案,row方案 效率: 第1:row 第2:max 第3:top 缺点: max

分页逻辑实现

断了今生、忘了曾经 提交于 2020-02-28 10:33:43
分页简介 用来将数据分割成多个部分来分页面展示。 什么时候用? 数据量达到一定的时候,就需要使用分页来进行数据分割。要不然可能会面临以下问题: 客户端一次性显示太多数据会影响到用户的体验,比如很难找到客户想要的信息,以及加载页面数据过慢。 对于服务端来说,一次性传送的数据过多,可能造成内存溢出。 分页的分类 分页分为真分页和假分页: 真分页(物理分页): 在mysql中使用select * from table where …limit start , size(在oracle中复杂些) 第一个参数start代表开始数据的索引位置 第二个参数是要查询多少条数据 假分页(逻辑分页): 直接使用select * from table where … 这样将所有数据查询出来存放到内存中,每次需要查询时直接从内存中去取出相应索引区间的数据 区别 真分页相比于假分页不会造成内存溢出,但翻页的数据相比于假分页又慢,所以根据实际情况选择分页方式,如果数据量不大,可以考虑使用假分页使翻页速度加快。 实现 假分页 假分页实际上使用List去存储所有查询出的值,再用subList方法获取两个索引之间的数据。 先在dao层,创建StudentMapper接口 List < Student > queryStudentsByArray ( ) ; 再创建StudentMapper.xml文件,编写查询语句