MySQL深分页问题原理与三种解决方案

欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习


1 深分页问题

1.1 创建表

CREATE TABLE `player` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `player_id` varchar(256) NOT NULL COMMENT '运动员编号',
  `player_name` varchar(256) NOT NULL COMMENT '运动员名称',
  `height` int(11) NOT NULL COMMENT '身高',
  `weight` int(11) NOT NULL COMMENT '体重',
  `game_performance` text COMMENT '最近一场比赛表现',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

1.2 新增100万条数据

@SpringBootTest(classes = TestApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class PlayerServiceTest {

    @Resource
    private PlayerRepository playerRepository;

    @Test
    public void initBigData() {
        for (int i = 0; i < 1000000; i++) {
            PlayerEntity entity = new PlayerEntity();
            entity.setPlayerId(UUID.randomUUID().toString());
            entity.setPlayerName("球员_" + System.currentTimeMillis());
            entity.setWeight(150);
            entity.setHeight(188);
            entity.setGamePerformance("{\"runDistance\":8900.0,\"passSuccess\":80.12,\"scoreNum\":3}");
            playerRepository.insert(entity);
        }
    }
}

1.3 深分页语句

select * from player limit 990000,5

1.4 结果分析

  • 查询耗时:1.233秒
  • 本语句目标查询[990001-990005]五条数据
  • 但是执行时需要排序[1-990005]数据
  • 最终丢弃[1-990000]只返回[990001-990005]数据

2 深分页优化方案

2.1 方案一

我们可以从业务形态维度去解决,可以参考搜索引擎解决方案。因为ES也存在深分页问题,搜索引擎解决方案是在业务上会限制查询页数。因为页数越大,内容相关度越低,所以页数太大对业务价值不高。MySQL可以类比处理:

  • 限制查询页数
  • 限制全量导出
  • 查询时要求带必要条件(时间范围、userId)

2.2 方案二

2.2.1 优化语句

select * from player a, (select id as tmpId from player limit 990000,5) b WHERE a.id = b.tmpId

2.2.2 执行计划

(1) 查看计划
explain select * from player a, (select id as tmpId from player limit 990000,5) b WHERE a.id = b.tmpId

请添加图片描述


(2) 执行顺序
  • id越大执行顺序越靠前

  • id相同则按照行数从上到下执行

  • 本语句执行顺序如下图:
    请添加图片描述

  • 第一步和第二步表示执行子查询

  • 第三步表示player表与子查询关联


(3) explain type

访问类型是重要分析指标:

03 explain_type.jpg


(4) explain Extra

Extra表示执行计划扩展信息重点关注三个:

04 explain extra.jpg


2.2.3 结果分析

  • 查询耗时:0.5秒
  • 原因是覆盖索引提升分页查询效率(只查询ID列)
  • 覆盖索引含义是查询时索引列完全包含查询列
  • using index表示使用覆盖索引,性能提升

2.3 方案三

2.3.1 优化语句

select * from player where id > 990000 LIMIT 5

2.3.2 执行计划

(1) 查看计划
explain select * from player where id > 990000 LIMIT 5

请添加图片描述


(2) 结果分析
  • 查询耗时:0.001秒
  • range表示索引范围搜索性能尚可

(3) 适用场景
  • 不适用跳页场景
  • 只适用【上一页】【下一页】场景

3 MyBatis

<mapper namespace="com.test.java.front.test.mysql.deep.page.repository.PlayerRepository">

	<resultMap id="BaseResultMap" type="com.test.java.front.test.mysql.deep.page.entity.PlayerEntity">
		<id column="id" jdbcType="BIGINT" property="id" />
		<result column="player_id" jdbcType="VARCHAR" property="playerId" />
		<result column="player_name" jdbcType="VARCHAR" property="playerName" />
		<result column="height" jdbcType="INTEGER" property="height" />
		<result column="weight" jdbcType="INTEGER" property="weight" />
		<result column="game_performance" jdbcType="LONGVARCHAR" property="gamePerformance" />
	</resultMap>

	<sql id="Base_Column_List">
		id, player_id, player_name, height, weight, game_performance
	</sql>

	<sql id="conditions">
		<where>
			<if test="playerId != null">
				and player_id = #{playerId,jdbcType=VARCHAR}
			</if>
		</where>
	</sql>

	<sql id="pager">
		<if test="skip != null and limit != null">
			limit #{skip}, #{limit}
		</if>
	</sql>

	<!-- 查询条数 -->
	<select id="selectPageCount" parameterType="com.test.java.front.test.mysql.deep.page.param.biz.PlayerQueryParam" resultType="java.lang.Long">
		select count(*) from player
		<include refid="conditions" />
	</select>

	<!-- 分页方式1:普通分页存在深分页问题 -->
	<!-- select * from player limit 990000,5 -->
	<select id="selectPager1" parameterType="com.test.java.front.test.mysql.deep.page.param.biz.PlayerQueryParam" resultMap="BaseResultMap">
		select
		<include refid="Base_Column_List" />
		from player
		<include refid="conditions" />
		<include refid="pager" />
	</select>

	<!-- 分页方式2:覆盖索引优化深分页问题 -->
	<!-- select * from player a, (select id as tmpId from player limit 990000,5) b where a.id = b.tmpId -->
	<select id="selectPager2" parameterType="com.test.java.front.test.mysql.deep.page.param.biz.PlayerQueryParam" resultMap="BaseResultMap">
		select
		<include refid="Base_Column_List" />
		from player a,
		(
		select id as tmpId from player
		<include refid="conditions" />
		<include refid="pager" />
		) b
		where a.id = b.tmpId
	</select>

	<!-- 分页方式3:Id分页不支持跳页 -->
	<!-- select * from player where id > 990000 limit 5 -->
	<select id="selectPager3" parameterType="com.test.java.front.test.mysql.deep.page.param.biz.PlayerQueryIdParam" resultMap="BaseResultMap">
		select
		<include refid="Base_Column_List" />
		<include refid="conditions" />
		from player where id > #{startId} limit #{pageSize}
	</select>
</mapper>

4 文章总结

本文第一介绍深分页问题表现和原因。第二介绍深分页问题三种解决方法,方案一是从业务维度优化,方案二是使用覆盖索引进行优化,方案三是使用Id分页。第三展示MyBatis相关代码。


欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容提要 本书全面入地介绍了MySQL的功能,主要内容包括MySQL、PHP、Apache、Perl等组件的安装与功能简介,mysql等一些重要系统管理工具和用户操作界面的使用,MySQL数据库系统设计的基础知识与用不同语言设计MySQL数据库的过程,以及SQL语法、工具、选项、API应用指南,最大限度地帮助读者更快地学习和掌握MySQL数据库系统的设计和使用。本书覆盖了MySQL 5.0,讨论了新的程序设计接口(如PHP 5里的mysqli)和新的系统管理工具。 本书是MySQL数据库管理员和开发人员的必备参考书。 目录 第一部分 入门  第1章 什么是MySQL   1.1 什么是数据库   1.2 MySQL   1.3 MySQL的不足   1.4 MySQL的版本编号   1.5 MySQL的许可证   1.6 MySQL软件的替代品   1.7 小结  第2章 测试环境   2.1 是Windows还是UNIX/Linux   2.2 在Windows系统上安装MySQL和相关软件   2.3 在SUSE Linux 9.3系统上安装MySQL和相关软件   2.4 在Red Hat Enterprise Linux 4系统上安装MySQL和相关软件   2.5 编译MySQL软件的开发者版本(Linux)   2.6 配置Apache   2.7 配置PHP   2.8 配置MySQL  第3章 初级案例研究:MySQL+PHP   3.1 概述   3.2 数据库的开发   3.3 调查问卷   3.4 问卷调查结果的处理和显示   3.5 改进意见 第二部分 管理工具和用户操作界面  第4章 mysqlmysqladmin和mysqldump   4.1 mysql   4.2 mysqladmin   4.3 mysqldump  第5章 MySQL Administrator和MySQL Query Browser   5.1 安装   5.2 与MySQL服务器建立连接   5.3 MySQL Administrator   5.4 MySQL Query Browser  第6章 phpMyAdmin   6.1 phpMyAdmin的安装与配置   6.2 用户管理,保护MySQL   6.3 创建和编辑数据库   6.4 查看、插入和编辑数据   6.5 执行SQL命令   6.6 导入和导出   6.7 服务器管理   6.8 辅助功能  第7章 Microsoft Office和OpenOffice/StarOffice   7.1 安装Connector/ODBC   7.2 Microsoft Access   7.3 Microsoft Excel   7.4 安装Connector/J   7.5 OpenOffice/StarOffice Base   7.6 OpenOffice/StarOffice的Data Source视图 第三部分 基础知识  第8章 数据库设计概论   8.1 参考读物   8.2 数据表类型   8.3 MySQL数据类型   8.4 数据库设计技巧   8.5 规范化   8.6 层次关系的处理   8.7 关系   8.8 主键和外键   8.9 索引   8.10 视图   8.11 示例数据库mylibrary(图书管理)   8.12 示例数据库myforum(网上论坛)   8.13 示例数据库exceptions(用于特殊情况的测试)  第9章 SQL语言入门   9.1 简介   9.2 简单查询(SELECT)   9.3 对查询结果进行排序(ORDER BY)   9.4 筛选数据记录(WHERE,HAVING)   9.5 涉及多个数据表的关联查询(LEFT/RIGHT JOIN)   9.6 合并查询结果(UNION)   9.7 分组查询,统计函数(GROUP BY)   9.8 修改数据(INSERT、UPDATE和DELETE)   9.9 创建数据表、数据库和索引  第10章 SQL解决方案   10.1 字符串   10.2 日期和时间   10.3 ENUM和SET数据类型   10.4 变量与条件表达式(IF、CASE)   10.5 在数据表间复制数据   10.6 统计报表   10.7 子查询   10.8 保证数据的一致性   10.9 找出冗余的数据记录   10.10 数据表设计方案的改进   10.11 对前n条或后n条记录进行处理   10.12 以随机方式选择数据记录   10.13 全文索引   10.14 锁定   10.15 事务  第11章 访问权限与信息安全   11.1 简介   11.2 急救   11.3 访问控制机制的内部工作原理   11.4 访问权限的设置工具   11.5 MySQL 4.1版本开始的安全密码验证   11.6 建立连接的问题   11.7 系统安全性  第12章 GIS函数   12.1 GIS数据格式   12.2 MySQL的GIS实现   12.3 SQL示例(冰川数据库)   12.4 SQL示例(opengeodb数据库)  第13章 存储过程和触发器   13.1 为什么要使用存储过程和触发器   13.2 初识SP   13.3 SP的实现   13.4 SP的管理   13.5 SP的语法和语言元素   13.6 SP应用示例   13.7 触发器  第14章 管理与服务器配置   14.1 基础知识   14.2 备份   14.3 数据库的迁移   14.4 导出和导入文本文件   14.5 日志   14.6 镜像机制   14.7 管理MyISAM数据表   14.8 InnoDB数据表的管理   14.9 MySQL服务器的优化   14.10 ISP数据库管理 第四部分 程序设计  第15章 PHP   15.1 mysql功能模块   15.2 mysqli的类、方法和属性   15.3 把数据库功能打包为一个类   15.4 把SELECT查询结果显示为一个表格   15.5 字符串、日期、时间、BLOB和NULL   15.6 向关联数据表插入新数据记录   15.7 处理来自HTML表单的输入数据   15.8 分页显示查询结果   15.9 处理层次化数据   15.10 速度优化   15.11 Unicode   15.12 二进制数据(BLOB)和图像   15.13 存储过程   15.14 SP Administrator  第16章 Perl   16.1 编程技巧   16.2 示例:删除无效的数据记录(mylibrary)   16.3 CGI示例:图书管理(mylibrary)   16.4 CGI Unicode示例  第17章 Java(JDBC和Connector/J)   17.1 基础知识   17.2 程序设计技巧  第18章 C语言   18.1 MySQL C API(libmysqlclient)   18.2 Hello,World   18.3 与MySQL服务器建立连接   18.4 执行SQL命令   18.5 处理二进制数据和特殊字符   18.6 出错处理  第19章 Visual Basic 6/VBA   19.1 基础知识和术语   19.2 Connector/ODBC选项   19.3 ADO程序设计与Visual Basic 6/VBA   19.4 与MySQL服务器建立连接   19.5 转换器:从Microsoft SQL Server到MySQL   19.6 VBMySQLDirect  第20章 Visual Basic .NET和C#   20.1 ADO .NET与MySQL之间的通信   20.2 编程技巧   20.3 示例:把新图书记录存入mylibrary数据库   20.4 示例:把图像文件存入和读出一个BLOB数据列 第五部分 参考资料  第21章 SQL语法指南   21.1 语法   21.2 操作符   21.3 变量和常数   21.4 MySQL数据类型   21.5 SQL命令汇总表(按功能分类)   21.6 SQL命令指南(按字母表顺序排列)   21.7 SQL函数指南   21.8 GIS数据类型与GIS函数   21.9 与存储过程和触发器有关的语言元素  第22章 MySQL工具和选项   22.1 概述   22.2 通用选项和配置文件   22.3 mysqld程序(服务器)   22.4 mysqld_safe脚本(启动MySQL服务器)   22.5 mysql_install_db脚本(安装mysql数据库)   22.6 mysql_fix_privileges脚本(更新mysql数据库)   22.7 mysql_fix_extensions脚本(重命名MyISAM文件)   22.8 mysql程序(SQL命令解释器)   22.9 mysqladmin程序(日常管理)   22.10 mysqldump程序(数据的备份/导出)   22.11 mysqlimport程序(文本导入、批量导入)   22.12 mysqlshow程序(查看信息)   22.13 myisamchk程序(修复MyISAM文件)   22.14 myisampack程序(压缩MyISAM文件)  第23章 MySQL API应用指南   23.1 PHP API(mysql接口)   23.2 PHP API(mysqli接口)   23.3 Perl DBI   23.4 JDBC(Connector/J)   23.5 ADO .NET(Connector/Net)   23.6 C API 第六部分 附录  附录A 术语解释  附录B 本书的配套示例文件  附录C 参考书目
内容提要 -------------------------------------------------------------------------------- 本书全面入地介绍了MySQL的功能,主要内容包括MySQL、PHP、Apache、Perl等组件的安装与功能简介,mysql等一些重要系统管理工具和用户操作界面的使用,MySQL数据库系统设计的基础知识与用不同语言设计MySQL数据库的过程,以及SQL语法、工具、选项、API应用指南,最大限度地帮助读者更快地学习和掌握MySQL数据库系统的设计和使用。本书覆盖了MySQL 5.0,讨论了新的程序设计接口(如PHP 5里的mysqli)和新的系统管理工具。   本书是MySQL数据库管理员和开发人员的必备参考书。 目录 -------------------------------------------------------------------------------- 第一部分 入门  第1章 什么是MySQL   1.1 什么是数据库   1.2 MySQL   1.3 MySQL的不足   1.4 MySQL的版本编号   1.5 MySQL的许可证   1.6 MySQL软件的替代品   1.7 小结  第2章 测试环境   2.1 是Windows还是UNIX/Linux   2.2 在Windows系统上安装MySQL和相关软件   2.3 在SUSE Linux 9.3系统上安装MySQL和相关软件   2.4 在Red Hat Enterprise Linux 4系统上安装MySQL和相关软件   2.5 编译MySQL软件的开发者版本(Linux)   2.6 配置Apache   2.7 配置PHP   2.8 配置MySQL  第3章 初级案例研究:MySQL+PHP   3.1 概述   3.2 数据库的开发   3.3 调查问卷   3.4 问卷调查结果的处理和显示   3.5 改进意见 第二部分 管理工具和用户操作界面  第4章 mysqlmysqladmin和mysqldump   4.1 mysql   4.2 mysqladmin   4.3 mysqldump  第5章 MySQL Administrator和MySQL Query Browser   5.1 安装   5.2 与MySQL服务器建立连接   5.3 MySQL Administrator   5.4 MySQL Query Browser  第6章 phpMyAdmin   6.1 phpMyAdmin的安装与配置   6.2 用户管理,保护MySQL   6.3 创建和编辑数据库   6.4 查看、插入和编辑数据   6.5 执行SQL命令   6.6 导入和导出   6.7 服务器管理   6.8 辅助功能  第7章 Microsoft Office和OpenOffice/StarOffice   7.1 安装Connector/ODBC   7.2 Microsoft Access   7.3 Microsoft Excel   7.4 安装Connector/J   7.5 OpenOffice/StarOffice Base   7.6 OpenOffice/StarOffice的Data Source视图 第三部分 基础知识  第8章 数据库设计概论   8.1 参考读物   8.2 数据表类型   8.3 MySQL数据类型   8.4 数据库设计技巧   8.5 规范化   8.6 层次关系的处理   8.7 关系   8.8 主键和外键   8.9 索引   8.10 视图   8.11 示例数据库mylibrary(图书管理)   8.12 示例数据库myforum(网上论坛)   8.13 示例数据库exceptions(用于特殊情况的测试)  第9章 SQL语言入门   9.1 简介   9.2 简单查询(SELECT)   9.3 对查询结果进行排序(ORDER BY)   9.4 筛选数据记录(WHERE,HAVING)   9.5 涉及多个数据表的关联查询(LEFT/RIGHT JOIN)   9.6 合并查询结果(UNION)   9.7 分组查询,统计函数(GROUP BY)   9.8 修改数据(INSERT、UPDATE和DELETE)   9.9 创建数据表、数据库和索引  第10章 SQL解决方案   1
目录 第1章 JDBC概述 1.1 JDBC简介 1.2 JDBC3.0规范 1.3 JDBC3.0 API的新特点 1.3.1 JDBC 3.0 API的一致性 1.3.2 不赞成的API 1.4 JDBC 3.0中的类和接口 1.4.1 java.sql包中的类和接口及其使用 1.4.2 javax.sql包中所含内容及其使用 1.5 JDBC驱动程序简介 1.5.1 JDBC-ODBC 桥和ODBC驱动程序 1.5.2 本地API部分Java驱动程序 1.5.3 JDBC网络纯Java驱动程序 1.5.4 本地协议纯Java驱动程序 1.5.5 JDBC驱动程序的比较 1.6 本章小结 第2章 JDBC开发环境及配置 2.1 数据库系统 2.1.1 SQL数据库数据库基本操作语句 2.1.2 Microsoft SQL Server数据库设计及ODBC配置 2.1.3 Oracle 数据库的基本说明及其使用简介 2.1.4 MySQL的安装及使用简介 2.2 使用JDBC连接数据库 2.2.1 SQLJ基本知识 2.2.2 用PL/SQL和Java建立应用程序的基本知识 2.2.3 PL/SQL和Java的特性 2.2.4 PL/SQL和Java的实际开发应用实例 2.2.5 Java连接各类数据库的程序代码 2.3 Web应用服务器 2.3.1 Tomcat的安装及系统文件设置 2.3.2 WebSphere简介 2.3.3 WebLogic的安装和配置 2.3.4 Resin的安装与配置 2.4 Java开发环境 2.4.1 JDK设置 2.4.2 JBuilder的配置 2.4.3 Cafe的配置 2.4.4 JDeveloper的配置 2.4.5 FORTE FOR JAVA简介 2.5 JDBC开发调试技巧 2.6 本章小结 第3章 JDBC3.0 API数据库开发基本操作 3.1 数据库用例说明 3.2 与数据库建立连接 3.2.1 JDBC URL 3.2.2 连接事件(Connection Event) 3.2.3 连接事件监听器(Connection EventListener) 3.3 获取数据库信息 3.3.1 获取数据库详细信息 3.3.2 获取数据库基本信息 3.3.3 获取数据库中表的信息 3.3.4 获取表中各列的信息 3.3.5 获取索引的信息 3.3.6 获取数据库中各种信息的实例 3.4 Statement对象 3.4.1 Statement对象使用基础 3.4.2 获取所有记录 3.4.3 获取指定记录 3.5 修改数据库表 3.5.1 修改数据库表本身 3.5.2 修改数据库表记录 3.6 结果集 3.6.1 结果集的基本操作 3.6.2 获取结果集的信息 3.6.3 使用流获取大型数据 3.6.4 可滚动结果集 3.6.5 可更新结果集 3.7 SQL和Java数据类型转换 3.8 本章小结 第4章 JDBC 3.0 API数据库开发高级操作 4.1 预编译语句 4.1.1 PreparedStatement对象的创建 4.1.2 传递IN参数 4.1.3 传递对象参数 4.1.4 传递大型数据参数 4.2 调用存储过程对象 4.2.1 CallableStatement对象的创建 4.2.2 IN、OUT及INOUT参数的使用 4.2.3 执行CallableStatement Object对象 4.2.4 CallableStatement对象使用实例 4.2.5 SQL Server存储过程编程经验技巧 4.3 成批更新(BatchedUpdate) 4.3.1 成批更新所使用的对象 4.3.2 使用成批更新的实例 4.4 行集合对象 4.4.1 设计时行集合 4.4.2 运行时行集合 4.4.3 非标准JDBC API类的行集 4.4.4 行集合的接口 4.5 事务 4.5.1 事务提交(Commit) 4.5.2 事务使用实例 4.6 JNDI与JDBC API 4.6.1 JDBC数据源 4.6.2 实例 4.7 连接池 4.7.1 连接池数据源(Connection PoolDataSource) 4.7.2 连接池处理事件 4.7.3 三层环境下的连接池操作 4.7.4 连接池和DataSource实现 4.7.5 包含连接池的数据源配置 4.7.6 池连接对象对于语句的重新利用 4.7.7 关闭池连接语句 4.7.8 连接池使用实例 4.8 分布式事务处理 4.8.1 XADataSource接口和XAConnection接口 4.8.2 事务管理器 4.8.3 关闭连接 4.9 例外处理 4.9.1 数据访问警告(SQLWarning) 4.9.2 数据截断(DataTruncation) 4.10 高级数据类型 4.10.1 Java对象类型 4.10.2 SQL3类型 4.10.3 定制类型 4.10.4 实例 4.11 本章小结 第5章 二层结构数据库开发实例 5.1 二层结构原理 5.2 Applet访问数据库实例 5.3 Application访问数据库实例 5.4 使用Jdevelpoer工具的数据库开发实例 5.5 二层结构开发数据库的优缺点 5.6 本章小结 第6章 三层结构数据库开发实例 6.1 三层结构原理 6.2 JSP数据库操作实例 6.3 Servlet数据库操作实例 6.4 JavaBeans操作数据库实例 6.5 三层结构开发数据库的优缺点 6.6 本章小结 第7章 综合开发实例分析 7.1 UML要点与应用 7.1.1 UML定义及组织 7.1.2 UML的概念模型 7.1.3 UML的应用 7.2 用UML建模开发网上商店实例 7.2.1 对网上商店的UML建模分析 7.2.2 网上商店数据库设计 7.2.3 网上商店的程序实现 7.3 用UML建模开发图书馆系统实例 7.4 本章小结 392 第8章 JAVA与XML数据转换 8.1 XML的基础知识 8.1.1 XML的特点 8.1.2 XML文档的结构 8.1.3 XML DTD的建立与使用 8.1.4 文档显示与样式单 8.1.5 XML链接语言 8.1.6 实用XML工具概览 8.2 XML中数据与信息交换 8.2.1 XML数据源 8.2.2 XML在数据库中的应用模式 8.2.3 XML数据交换技术及应用 8.3 使用JSP和XML两种技术建设动态网站 8.3.1 XML存储数据的优点 8.3.2 XML文档中的Picture对象定义 8.3.3 JSP文档与XML的结合 8.4 用XML和XSL生成动态页面 8.4.1 建立标准的数据格式 8.4.2 生成动态XML 8.4.3 用XSL作为模板语言 8.4.4 生成HTML 8.5 从XML到Java代码的数据绑定 8.5.1 访问方式选择 8.5.2 数据绑定 8.5.3 约束数据 8.5.4 从XML获得Java 8.5.5 生成Java代码 8.5.6 完成包 8.6 使用JSP技术生成动态XML 8.6.1 JSP技术概述 8.6.2 使用JSP技术生成动态XML文档的结构 8.7 本章小结 第9章 JDBC程序开发高级技术 9.1 中文处理技术 9.1.1 Java中文处理的理论知识 9.1.2 中文处理的解决方案 9.1.3 中文处理技术程序实例 9.2 数据查询结果的分页显示技术 9.2.1 使用JavaBean和连接池实现数据分页显示 9.2.2 不用连接池不用JavaBean的分页显示 9.2.3 使用JavaBean不使用连接池的分页显示 9.2.4 用JSP和Servlet配合实现分页显示 9.3 数据库图形文件的存取技术 9.3.1 向数据库中存储图形 9.3.2 将数据库的图象二进制数据显示成图片 9.4 Java开发中的其他技术 9.5 本章小结
MySQL分页问题指的是在查询大量数据时,需要获取结果集中某一页的数据,而这个页数非常靠后,会导致查询性能下降和资源消耗过大的情况。 解决MySQL分页问题可以尝试以下几种方法: 1. 使用索引:确保查询涉及到的列有合适的索引。使用合适的索引可以提高查询的效率,减少扫描的数据量。根据查询条件和排序需求,创建适当的索引,以加速分页查询。 2. 使用游标分页:通过使用游标(Cursor)来获取分页数据,而不是传统的LIMIT和OFFSET语句。游标分页可以避免MySQL在每次查询时都重新扫描和跳过前面的记录,提高查询性能。 3. 使用分页缓存:将查询结果缓存在应用程序的内存中,避免每次都向数据库发送分页查询请求。可以使用缓存技术如Redis、Memcached等,将结果集按页缓存,并根据需要从缓存中获取数据。 4. 使用预取技术:通过一次性获取多页数据,而不仅仅是当前需要的一页。可以通过增加查询范围,一次性获取多个页面的数据,并在应用程序中进行缓存和管理,以提高后续分页查询的效率。 5. 数据分片:如果可能,将数据进行分片(Sharding),将数据分散存储在多个数据库中。这样可以将大量数据分散到不同的数据库中,从而减轻单个数据库的负载,提高查询性能。 需要根据具体的应用场景和需求选择合适的解决方案。同时,注意评估和测试每种解决方案的效果,以确保其适用性和性能提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值