精华内容
下载资源
问答
  • 【mySQL】mysql数据库分页查询讨论专题

    万次阅读 多人点赞 2019-05-05 14:36:37
    MySQL:limit分页公式、总页数公式 1) limit分页公式 (1)limit分页公式:curPage是当前第几页;pageSize是一页多少条记录 limit (curPage-1)*pageSize,pageSize (2)用的地方:sql语句中 select * from student...

    目录

    一、limit分页公式、总页数公式

    1 limit分页公式

    2 总页数公式

    二 、Mysql的三种分页方法

    1 limit m,n分页语句(低效)

    2 limit m语句 (有局限)

    三、 查询优化

    1 使用子查询优化

    2 使用 id 限定优化(前提:id是连续递增,删除过记录不符合)

    3 使用临时表优化

    四、关于数据表的id说明

    五、欢迎大家提出错误和新方案


    一、limit分页公式、总页数公式


    1 limit分页公式


    (1)limit分页公式:curPage是当前第几页;pageSize是一页多少条记录

    limit  (curPage-1)*pageSize,pageSize

    (2)用的地方:sql语句中

    select * from student limit(curPage-1)*pageSize,pageSize;

    2 总页数公式


    (1)总页数公式:totalRecord是总记录数;pageSize是一页分多少条记录

    int totalPageNum = (totalRecord +pageSize - 1) / pageSize;

    (2)用的地方:前台UI分页插件显示分页码
    (3)查询总条数:totalRecord是总记录数,SELECT COUNT(*) FROM tablename


    二 、Mysql的三种分页方法

    1 limit m,n分页语句(低效)

    select * from dept order by deptno desc limit 3,3;
    select * from dept order by deptno desc limit m,n;

    limit 3,3的意思扫描满足条件的3+3行,撇去前面的3行,返回最后的3行,那么问题来了,如果是limit 200000,200,需要扫描200200行,如果在一个高并发的应用里,每次查询需要扫描超过20W行,效率十分低下。

    测试见:https://www.cnblogs.com/youyoui/p/7851007.html

    例如:

    select * from orders_history where type=8 limit 100,100;
    select * from orders_history where type=8 limit 1000,100;
    select * from orders_history where type=8 limit 10000,100;
    select * from orders_history where type=8 limit 100000,100;
    select * from orders_history where type=8 limit 1000000,100;

    耗时分别如下:

    • 查询100偏移:        25ms 
    • 查询1000偏移:      77ms 
    • 查询10000偏移:    3128ms
    • 查询100000偏移:  3812ms
    • 查询1000000偏移:14608ms

    2 limit m语句 (有局限)

     select * from dept where deptno >10 order by deptno asc limit n;//下一页
     select * from dept where deptno <60 order by deptno desc limit n//上一页

    这种方式不管翻多少页只需要扫描n条数据。

    但是,虽然扫描的数据量少了,但是在某些需要跳转到多少页的时候就无法实现,这时还是需要用到方法1,既然不能避免,那么我们可以考虑尽量减小m的值,因此我们可以给这条语句加上一个条件限制。使得每次扫描不用从第一条开始。这样就能尽量减少扫描的数据量。

    例如:每页10条数据,当前是第10页,当前条目ID的最大值是109,最小值是100.(当前100-109)
    那么跳到第9页:

    select * from dept where deptno<100 order by deptno desc limit 0,10;   //倒序

    那么跳到第8页:

    select * from dept where deptno<100 order by deptno desc limit 10,10;

    那么跳到第11页:

    select * from dept where deptno>109 order by deptno asc limit 0,10;


    最后附上参考文档网址:http://www.open-open.com/doc/view/2bda32bf64864e8e965e91686f5309d4
    原文:https://blog.csdn.net/HADEWOKE/article/details/53996110

    注意:这个方法有个局限,就是需要deptno是连续的,也就是中间的记录不能有删除。(可以用删除标志代替真正的物理删除)

    上面的方法还可以优化,见第三。

    三、 查询优化

    子查询优化原理:https://zhuanlan.zhihu.com/p/163658548

    1 使用子查询优化

    这种方式先定位偏移位置的 id,然后往后查询,这种方式适用于 id 递增的情况。

    select * from orders_history where type=8 limit 100000,1;
    select id from orders_history where type=8 limit 100000,1;
    
    select * from orders_history where type=8 and 
    id>=(select id from orders_history where type=8 limit 100000,1) 
    limit 100;
    
    select * from orders_history where type=8 limit 100000,100;
    

    4条语句的查询时间如下:

    • 第1条语句:3674ms
    • 第2条语句:1315ms
    • 第3条语句:1327ms
    • 第4条语句:3710ms

    针对上面的查询需要注意:

    • 比较第1条语句和第2条语句:使用 select id 代替 select * 速度增加了3倍
    • 比较第2条语句和第3条语句:速度相差几十毫秒
    • 比较第3条语句和第4条语句:得益于 select id 速度增加,第3条语句查询速度增加了3倍

    这种方式相较于原始一般的查询方法,将会增快数倍。

    2 使用 id 限定优化(前提:id是连续递增,删除过记录不符合)

    这种方式假设数据表的id是连续递增的,则我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询:

    select * from orders_history where type=2 
    and id between 1000000 and 1000100 limit 100;
    

    查询时间:15ms 12ms 9ms

    这种查询方式能够极大地优化查询速度,基本能够在几十毫秒之内完成。限制是只能使用于明确知道id的情况,不过一般建立表的时候,都会添加基本的id字段,这为分页查询带来很多便利。

    还可以有另外一种写法:

    select * from orders_history where id >= 1000001 limit 100;
    

    当然还可以使用 in 的方式来进行查询,这种方式经常用在多表关联的时候进行查询,使用其他表查询的id集合,来进行查询:

    select * from orders_history where id in
    (select order_id from trade_2 where goods = 'pen')
    limit 100;
    

    这种 in 查询的方式要注意:某些 mysql 版本不支持在 in 子句中使用 limit。

    3 使用临时表优化

    这种方式已经不属于查询优化,这儿附带提一下。

    对于使用 id 限定优化中的问题,需要 id 是连续递增的,但是在一些场景下,比如使用历史表的时候,或者出现过数据缺失问题时,可以考虑使用临时存储的表来记录分页的id,使用分页的id来进行 in 查询。这样能够极大的提高传统的分页查询速度,尤其是数据量上千万的时候。

    四、关于数据表的id说明

    一般情况下,在数据库中建立表的时候,强制为每一张表添加 id 递增字段,这样方便查询。

    如果像是订单库等数据量非常庞大,一般会进行分库分表。这个时候不建议使用数据库的 id 作为唯一标识,而应该使用分布式的高并发唯一 id 生成器来生成,并在数据表中使用另外的字段来存储这个唯一标识。

    使用先使用范围查询定位 id (或者索引),然后再使用索引进行定位数据,能够提高好几倍查询速度。即先 select id,然后再 select *;

    https://www.cnblogs.com/youyoui/p/7851007.html

    五、欢迎大家提出错误和新方案

    欢迎大家指出错误、隐患、缺陷或提出补充、更好的方案,相互探讨。

    @UESTC

    展开全文
  • 易语言MYSQL数据库分页查询.rar 易语言MYSQL数据库分页查询.rar 易语言MYSQL数据库分页查询.rar 易语言MYSQL数据库分页查询.rar 易语言MYSQL数据库分页查询.rar 易语言MYSQL数据库分页查询.rar
  • 易语言源码MYSQL数据库分页查询.rar 易语言源码MYSQL数据库分页查询.rar 易语言源码MYSQL数据库分页查询.rar 易语言源码MYSQL数据库分页查询.rar 易语言源码MYSQL数据库分页查询.rar 易语言源码MYSQL数据库分页...
  • Mysql数据库分页查询

    2016-07-31 16:17:03
    MySQL 数据库分页 使用limit; Select * from TABLE limit (n-1)*m,m; (n-1)*m是指开始页码 ,n是当前是第几页,m是每页显示的数据个数。 例 每页十条数据 第一页 select * from TABLE limit 0,10; 第二页 sele

    数据库分页查询

    不同的数据库分页查询是不一样的

    MySQL 数据库分页

    使用limit;

    Select * from TABLE limit (n-1)*m,m; 

    (n-1)*m是指开始页码 ,n是当前是第几页,m是每页显示的数据个数。

    每页十条数据

    第一页 
    select * from TABLE limit 0,10;

    第二页 
    select * from TABLE limit 10,10;

    第三页 
    select * from TABLE limit 20,10;

    展开全文
  • oracle数据库和mysql数据库分页查询有什么区别?有何不同?具体,求教!
  • mysql数据库分页查询

    2016-03-20 16:37:31
    一、MySQL 数据库分页查询 MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。 LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数...

    一、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行数据

     

     

     

     

     

    展开全文
  • MySQL 数据库 分页查询

    2017-04-23 13:56:22
    在使用MySQL 进行数据库分页查询的时候最主要是使用LIMIT子句进行查询: 首先来看一下LIMIT: LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的...

    在使用MySQL 进行数据库分页查询的时候最主要是使用LIMIT子句进行查询:

    首先来看一下LIMIT:

    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行数据

    select * from table WHERE ... LIMIT 4 offset 9; # 返回从第9行开始的4条记录

    所以通过LIMIT和OFFSET或只通过LIMIT可以实现分页功能

    假设 numPerPage 表示每页要显示的条数

            pageNum表示页码

    那么 返回第pageNum页,每页条数为numPerPage 条数据的sql语句写法为

    语句1:select * from table limit (pageNum-1)*numPerPage ,numPerPage 

    语句2:select * from table limit numPerPage offset (pageNum-1)*numPerPage

    分页语句:

    方式一:

    select * from table order by id limit m, n;

    该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录。无疑该查询能够实现分页功能,但是如果m的值越大,查询的性能会越低(越后面的页数,查询性能越低),因为MySQL同样需要扫描过m+n条记录。

    方式二:

    select * from table where id > #max_id# order by id limit n;

    该查询每次会返回n条记录,却无需像方式1扫描过m条记录,在大数据量的分页情况下,性能可以明显好于方式1,但该分页查询必须要每次查询时拿到上一次查 询(上一页)的一个最大id(或最小id)。该查询的问题就在于,我们有时没有办法拿到上一次查询(上一页)的最大id(或最小id),比如当前在第3 页,需要查询第5页的数据,该查询方法便爱莫能助了。

    方式三:

    为了避免能够实现方式2不能实现的查询,就同样需要使用到limit m, n子句,为了性能,就需要将m的值尽力的小,比如当前在第3页,需要查询第5页,每页10条数据,当前第3页的最大id为#max_id#:

     select * from table where id > #max_id# order by id limit 20, 10;
     

    其实该查询方式是部分解决了方式2的问题,但如果当前在第2页,需要查询第100页或1000页,性能仍然会较差。

    方式四:

     select * from table as a inner join (select id from table order by id limit m, n) as b on a.id = b.id order by a.id;

    该查询同方式1一样,m的值可能很大,但由于内部的子查询只扫描了字段id,而不是整张表,所以性能要强于方式1查询,并且该查询能够解决方式2和方式3不能解决的问题。

    方式五:

     select * from table where id > (select id from table order by id limit m, 1) limit n;

    该查询方式同方式4,同样通过子查询扫描字段id,效果同方式4。至于性能的话,方式5的性能会略好于方式4,因为方式5不需要在进行表的关联,而是一个简单的比较。

     

    参考:

    http://www.cnblogs.com/duhuo/p/4239436.html

    http://www.cnblogs.com/0201zcr/p/4709758.html

    标签: MySQL

    «上一篇:Async
    »下一篇:深入理解 Session 与 Cookie
    展开全文
  • 谈下实现方法吧,说是JSP连接mysql,其实是在JSP中利用来直接写java代码通过JDBC连接mysql。JDBC连接各种数据库的方式就不做过多的介绍了,相信网上...数据库分页针对于不同的数据库方法不同,具体方法还是那句话:网上
  • MySQL 数据库 分页查询/聚合查询

    千次阅读 2019-03-11 14:29:10
    MySQL中,分页查询一般都是使用limit子句实现,limit子句声明如下: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT子句可以被用于指定 SELECT 语句返回的记录数。需注意以下几点: 1、...
  • SQLserver/Oracle/MySQL数据库分页 SQL语句几条常见的数据库分页 我们在编写MIS系统和Web应用程序等系统时,都涉及到与数据库的交互,如果数据库中数据量很大的话,一次检索所有的记录,会占用系统很大的资源,因此...
  • MySQL分页查询出现重复数据 情景(situation):   今天在生产环境,业务同事导出文件时遇到了出现重复数据的问题。因为之前这个功能是我和我带的外包同事一起做的,所以很熟悉这块代码。经过线上操作核对,和代码...
  • php、mysql数据库分页功能两种方法

    千次阅读 2020-04-15 21:34:27
    利用php将数据库中的数据进行分页显示,有两种方法,但是无论第一种方法。,还是第二种方法都需要判断是否传入参数,和参数默认值问题 <?php if(!isset($_GET['page'])){//如果没有传入参数page $page=1;//这里...
  • Java web访问MySql数据库分页查询

    千次阅读 2015-09-14 21:28:39
    有时候我们查询数据库表时,...Mysql数据库提供了limit a,b的关键字,a是数据库表的查询起始位置,是个偏移量,b是指定本次查询的记录数目 下面是我的数据表: 数据库的链接类: package com.tools; import jav
  • koa2实现mysql数据库分页

    千次阅读 2018-12-21 11:43:17
    1,nodejs6.x版本不支持ES6 nodejs6下使用koa2 ... 2,windows下mysql5.7版本更改默认字符编码 mysql修改charactet_set_server编码为utf8 http://blog.csdn.net/u012593344/article/details/51...
  • Oracle\MySQL数据库分页查询实例

    千次阅读 2015-09-09 11:59:02
    MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。 LIMIT语句可以用来限制由SELECT语句返回过来的数据数量,它有一个或者两个参数,如果给出两个参数,第一个参数指定返回的第...
  • sql 查询 db.user.OrderByDescending(c => c.time).Skip(pageSize * (pageNumber - 1)).Take(pageSize).ToList();...mysql 查询 原生的分页查询语句 select * from table limit (pageindex-1)*pagec
  • 比如有3个数据库,当进行一次查询时,分别在这3个数据库中执行相同的SQL查询语句,然后把查询结果都放到一个LIST中,然后排序,然后根据页码和每页显示的条数来取出需要的数据返回给页面进行显示。 如果查询出来的...
  • 目前来说比较好的一个对数据库数据分页的工具类
  • 下面是一个简单的php连接mysql数据库进行数据分页显示的模版.可以按注释说明信息进行修改,里面的sql语句是可以自己改的. 注意分析和观察里面相关分页部分的代码的书写和实现的方式. 以下为引用的内容: $link = ...
  • 下面是一个简单的php连接mysql数据库进行数据分页显示的模版.可以按注释说明信息进行修改,里面的sql语句是可以自己改的.注意分析和观察里面相关分页部分的代码的书写和实现的方式.$link = mysql_connect(localhost...
  • MySQL、Oracle数据库分页MySQL数据库分页MySQL数据库分页较Oracle简单,用Limite关键字。代码如下: SELECT * FROM TABLE_NAME LIMIT NUM1 ,NUM2; TABLE_NAME 为要查询的表,NUM1是从第几条开始查询,NUM2是共...
  • MySQL数据库面试题(2020最新版)

    万次阅读 多人点赞 2020-03-10 17:20:40
    数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4...
  • 1)oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum=startrow ...2)MySQL数据库分页 Select * from 表名 limit startrow,pagesize (Pagesize为每页显示的记录条数)
  • hibernate可以封装分页操作,getsession得到query后、list()前可以用query的setFrist.......网上人都说达到百万级后数据库查询会暴露各种性能问题,这次我在单个表达到9w数据量时查询缓慢,查询65535开始
  • 数据库分页
  • mysql数据库实现分页

    2013-05-18 00:00:37
    对于mysql中的大量数据显示问题,进行了分页,使得数据可以更加清晰的显示
  • MySQL数据库总结

    万次阅读 多人点赞 2019-11-25 13:26:13
    一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、...主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...
  • mysql 数据库sql分页

    2013-08-01 16:58:39
    mysql> select pname from product; +--------+ | pname | +--------+ | 产品1 | | 产品2 | | 产品三 | +--------+ 3 rows in set (0.00 sec) 这个地方是说,从product中选出所有的pname来,一共有三条...
  • 在 这里主要讲解一下MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法。可能会有人说这 些网上都有,但我的主要目的是把这些知识通过我实际的应用...MySQL数据库实现分页比较简单,提供了

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,099
精华内容 42,839
关键字:

mysql数据库分页

mysql 订阅