mysql优化大批量数据时的分页操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mysql大数据量下的优化分页的方式,仅供参考。

一、mysql在大数据量下 使用传统的分页方式会带来什么问题?

主要就是会带来性能瓶颈问题、查询巨慢的问题。大数据量下如果继续使用xxx,xxx(比如说:limit 1000000,10)随着offset增大,查询的速度会越来越慢,因为mysql会把前面的数据都取出,然后才能找到对应位置,所以数据量越大 就导致这种查询方式越慢,这样肯定是不行的。

二、准备相关测试表

DROP` `TABLE` `IFEXISTS`testemployee`;``CREATE` `TABLE` ``testemployee`(`````id```int``(11)``NOT` `NULL` `AUTO_INCREMENT,```````name`````varchar``(20)``DEFAULT` `NULL``,`````dep_id```int``(11)``DEFAULT` `NULL``,`````age```int``(11)``DEFAULT` `NULL``,`````salary```decimal``(10,2)``DEFAULT` `NULL``,`````cus_id```int``(11)``DEFAULT` `NULL``,````PRIMARY` `KEY` `(`id`)``)ENGINE=InnoDBAUTO_INCREMENT=1``DEFAULT` `CHARSET=utf8;` `-- 假设testemployee表中已经有100w数据

三、优化分页的方式

3.1、使用子查询优化

-- 子查询方式1 ``SELECT` `* ``FROM` `testemployee t ``INNER` `JOIN` `(``SELECT` `id ``FROM` `testemployee t LIMIT 990000,10) tmp ``ON` `t.id = tmp.id``-- 上面该条sql语句优化思路是:子查询里面只查询主键id列,这样会走主键索引,所以查询速度快。然后和外部的sql做一个内连接,将符合条件的数据取出。` `-- 子查询方式2``select` `* ``from` `testemployee ``where` `id >=(``SELECT` `id ``from` `testemployee limit 500000,1) limit 10``-- 上面该条sql语句优化思路是:子查询里面依然只查询主键id列,通过主键索引取出50w之后的那一条数据的主键id值。然后外部sql通过该id值,直接获取符合条件的10条数据。

总结:上面2条优化的sql思路都是 把耗时的操作放到子查询里面,但是子查询里面,是通过主键id索引快速找到对应的数据,然后外部sql根据子查询的结果直接获取符合条件的数据。

3.2、使用 id 限定优化方式

在程序中记录上一页最大的id号(php、java等各类语言),mysql中使用范围查询。

限制 是只能使用于明确知道id的情况,不过一般建立表的时候都会添加基本的id字段,这为分页查询带来很多便利。

示例sql如下:

-- 限定方式1``select` `* ``from` `testemployee ``where` `id >= 990000 limit 10;` `-- 限定方式2``select` `* ``from` `testemployee ``where` `id ``between` `1000000 ``and` `1000100 limit 100;

四、总结

优化分页的主要方式就是查询数据的时候想办法让mysql走索引(使用索引),活学活用 别有的场景你没办法用主键id索引就没办法优化了。使用任何索引都是可以的呀。

五、尾声

以上就是一些mysql大数据量下的优化分页的方式,仅供参考。另外,如果你的数据量真的很大很大的话,那前台的分页肯定要适当做一下调整的。不要让用户能翻到真实的最后一页,业务可以做一下限制,比如说前台分页只允许用户翻到前200页即可,也没有人闲的一直给你翻到最后一页的。  比如百度的搜索结果分页,最大只让你翻到74页,就没有下一页了。如果还是想要有入口可以获取很久之前的数据,那么前台可以提供一个搜索入口,在搜索里面可以搜索所有的数据。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
118 9
|
2月前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
23天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
61 18
|
22天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
22 7
|
21天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
53 5
|
22天前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
84 6
|
1月前
|
关系型数据库 MySQL PHP
php实现一个简单的MySQL分页
通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。
29 4
|
1月前
|
SQL 关系型数据库 MySQL
mysql分页读取数据重复问题
在服务端开发中,与MySQL数据库进行数据交互时,常因数据量大、网络延迟等因素需分页读取数据。文章介绍了使用`limit`和`offset`参数实现分页的方法,并针对分页过程中可能出现的数据重复问题进行了详细分析,提出了利用时间戳或确保排序规则绝对性等解决方案。
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
57 2