mysql分页查询语句

mysql使用limit分页优化方案

隐身守侯 提交于 2019-12-16 10:30:19
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、测试实验 mysql分页直接用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秒 像这种分页最大的页码页显然这种时间是无法忍受的。 从中我们也能总结出两件事情:

MySQL中使用LIMIT分页

折月煮酒 提交于 2019-12-16 08:28:50
需求:客户端通过传递pageNum(页码)和pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据。   我们知道MySQL提供了分页函数limit m,n,但是该函数的用法和需求不一样,所以就需要根据实际情况去改写以满足需求。分析如下:   查询第1条到第10条数据的sql是:select * from table limit 0,10; ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;   查询第10条到第20条数据的sql是:select * from table limit 10,20; ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;   查询第20条到第30条数据的sql是:select * from table limit 20,30; ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;   通过上面的分析,可以归纳得出符合需求的分页SQL伪代码是:select * from table limit (pageNum-1)*pageSize,pageSize。总而言之,我们只需要告诉数据库要从第几行开始拿多少条数据就行了。   但是

MySQL大数据量分页查询方法

ぐ巨炮叔叔 提交于 2019-12-15 09:08:24
使用数据库提供的SQL语句 MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N select * from dept limit 800000, 20 36.34秒 适用于数据量较少的情况(元组百/千级) 全表扫描,速度会很慢 且 有的数据库 结果集返回不稳定 (如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余抛弃 建立主键或唯一索引, 利用索引 Mysql中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M 适用于数据量多的情况(元组数上万) 索引扫描,速度会很快. 有朋友提出: 因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3 基于索引再排序 MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1) 以上方法使用MySQL的排序操作,只有ASC,DESC查询的数据发生错误,并且id必须连续并且增长

mybatis分页

好久不见. 提交于 2019-12-11 16:26:34
mybatis的四种分页方式: 第一种.数组分页;查询所有数据,放到list里面。调接口取数据的时候通过参数页数,和条数在list里面截取出需要的数据。 第二种.sql分页;通过查询sql的limit限制,limit5,8;从第六条数据开始取出8条数据。 第三种.拦截器分页;实际上是把接口拦截下来,重新组装数据,把需要查询的页数,和条数通过sql查询出来,再返回出去。 第四种.rowbounds分页;使用 RowBounds 分页,非常方便,不需要在 sql 语句中写 limit,mybatis 会自动拼接 sql ,添加 limit。 数组分页 : mybatis接口:List<Student> queryStudentsByArray(); xml配置文件: <select id="queryStudentsByArray" resultMap="studentmapper"> select * from student </select> service: 接口 List<Student> queryStudentsByArray(int currPage, int pageSize); 实现接口 @Override public List<Student> queryStudentsByArray(int currPage, int pageSize) { //查询全部数据

MySQL分页查询优化

邮差的信 提交于 2019-12-10 04:03:12
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。下面简单说一下我知道的一些方法。 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明。 表名:order_history 描述:某个业务的订单历史表 主要字段:unsigned int id,tinyint(4) int type 字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500),id字段为索引,且为递增。 数据量:5709294 MySQL版本:5.7.16 线下找一张百万级的测试表可不容易,如果需要自己测试的话,可以写shell脚本什么的插入数据进行测试。 以下的 sql 所有语句执行的环境没有发生改变,下面是基本测试结果: select count(*) from orders_history; 返回结果:5709294 三次查询时间分别为: 8903 ms 8323 ms 8401 ms 一般分页查询 一般的分页查询使用简单的 limit 子句就可以实现。limit 子句声明如下: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于指定

Hibernate中的query.setFirstResult(),query.setMaxResu

♀尐吖头ヾ 提交于 2019-12-09 13:41:29
一、query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示。那么两者区别,以及两者的效率如何? 答:1.scroll是用JDBC2.0的可滚动结果集实现;query.setMaxResults();query.setFirstResult()是数据库SQL语句实现。 2.你说是在数据库就分页好呢?还是把结果集都取到内存再分页好呢?(应该是在数据库就分了好些吧,但是如果在内存分页的话,换页的时候是不是更快一些呢?) 3.在数据库进行分页是首选的方式。数据库分页实际上是利用数据库本身SQL扩展的功能进行分页,例如MySQL的 limit 0,50这样的SQL语句。不但速度快,而且非常节省内存。不过不是每种数据库的都有这种分页支持的SQL,例如SQL Server就不支持。 4.scroll是利用JDBC2.0的功能做分页的,那么就完全取决于特定数据库的JDBC Driver的实现了。事实上大部分JDBC Driver都是把所有的结果集都一次取到内存,然后再分页的。如果这个结果集非常大,例如几万条,不但程序执行速度会很慢,而且很容易导致out of memory。当然个别JDBC Driver使用了服务器端游标来实现,那么就不会导致这种问题,例如jTDS。 二

报表性能优化方案之单数据集分页SQL实现层式报表

淺唱寂寞╮ 提交于 2019-12-04 17:05:48
1、概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql 和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分页SQL。 下面以Access 数据库为例介绍需要写分页SQL的数据库怎样利用行式的引擎实现层式报表。 解决方案提供工具:报表开发工具FineReport 2、解决思路 对于mysql 这类可以直接使用行式的引擎实现层式报表的数据库来说,如果勾选了行式引擎,程序会自动生成分页sql,如,我新建了一个数据集ds1,来源于mysql数据库,基本sql语句为: SELECT * FROM 订单明细 如果不定义分页sql ,勾选行式引擎选项,预览报表时,程序会将上面的sql语句转化为下面的语句来取一页的数据: SELECT COUNT(*)AS totalRowCount FROM (SELECT * FROM 订单明细) t 如果数据库是上面所说的access 一类的无法直接生成分页sql的数据库,那么就需要编写分页SQL。 3、操作步骤 以FRDemo 内置的sqlite为例,说明sqlite如何写分页查询。 注:sqlserver2005 和sqlite操作步骤一样。 3.1新建数据集 新建数据集ds1 : SELECT * FROM 订单明细 。 3.2添加分页查询SQL 语句

有关mybatis的笔试

六月ゝ 毕业季﹏ 提交于 2019-12-04 16:29:18
1.mybatis 中的 #{} 和 ${} 的区别? 答 : 定义: #{} 是预编译。 作用: mybatis 处理 #{} 时, sql 会将它替换成 ? ,然后调用 PreparedStatement 的 set 方法来赋值;还可以防止 sql 注入。 注释: sql 注入是一种注入攻击,可以执行恶意的 sql 语句。是通过 sql 代码插入数据库查询,使得攻击者可以控制 web 应用服务后面的数据库服务器 , 可以对数据库进行一些操作。比如添加,修改和删除数据库中的数据。 定义 :${} 字符串替换。 作用: mybatis 处理 ${} 时, sql 会将它替换成变量的值。 2.mybatis 有几种分页方式? 答 : 有四种,分别是数组分页, sql 分页,拦截器分页, Rowbounds 分页。 3.mybatis 的物理分页与逻辑分页的区别? 答 : 定义:物理分页是依赖于某个物理实体,这个实体就是数据库,例如 mysql 数据库提供的 limit 关键字,程序员编写关于 limit 关键字的查询语句,数据库就会返回分页结果。 定义 : 逻辑分页是程序员编写的代码,数据库返回的不是分页结果,而是全部数据,然后程序员通过代码获取分页数据。常用操作就是一次性查询全部数据存放到 list 集合,然后通过索引获取指定范围的数据, 两者对比: 数据库的负担

iBatis SqlMap的配备总结

孤街浪徒 提交于 2019-12-04 06:58:19
iBatis SqlMap的配置总结 核心提示:SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间: sqlMap namespace=Account,在此空间外要引用此空间的元素,则需要加上命名空间名。 2、实体的别名: typeAlias alias=Account type=com.lavasoft.ibatissut.sim SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间: <sqlMap namespace="Account">,在此空间外要引用此空间的元素,则需要加上命名空间名。 2、实体的别名: <typeAlias alias="Account" type="com.lavasoft.ibatissut.simple.domain.entity.Account"/> 如果有用到的全名的地方,可以用别名代替,受命名空间约束。 3、插入操作 对于自增主键的表,插入可以不配置插入的主键列。否则是必须的。 4、获取主键 插入语句之前配置:主要是针对Sequence主键而言,插入前必须指定一个主键值给要插入的记录。Oracle、DB2亦如此,方法是在插入语句标签<insert....>之前配置上: <insert id="insertAccount"

ibatis sqlMap 使用

爷,独闯天下 提交于 2019-12-04 06:58:05
SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。 1、命名空间: <sqlMap namespace="Account"> 在此空间外要引用此空间的元素,则需要加上命名空间名。 2、实体的别名: <typeAlias alias="Account" type="com.lavasoft.ibatissut.simple.domain.entity.Account"/> 如果有用到的全名的地方,可以用别名代替,受命名空间约束。 3、插入操作 对于自增主键的表,插入可以不配置插入的主键列。否则是必须的。 4、获取主键 插入语句之前配置:主要是针对Sequence主键而言,插入前必须指定一个主键值给要插入的记录。Oracle、DB2亦如此,方法是在插入语句标签<insert....>之前配置上: <insert id="insertAccount" parameterClass="Account"> <selectKey resultClass="long" keyProperty="sctId"> SELECT SEQ_TEST.NEXTVAL FROM DUAL </selectKey> insert into .... ........ </insert> 插入语句之后配置:主要是针对自增主键的表而言,这类表在插入时不需要主键