LIMIT page_no,page_total分页的优化

2024-02-26 11:58
文章标签 优化 分页 limit page total

本文主要是介绍LIMIT page_no,page_total分页的优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载http://yueliangdao0608.blog.51cto.com/397025/108237关于分页的优化。
我们知道,在MySQL中分页很简单,直接LIMIT page_no,page_total 就可以了。
可是当记录数慢慢增大时,她就不那么好使了。
这里我们创建摘要表来记录页码和原表之间的关联。
下面为测试数据。

原表:
CREATE TABLE `t_group` (
  `id` int(11) NOT NULL auto_increment,
  `money` decimal(10,2) NOT NULL,
  `user_name` varchar(20) NOT NULL,
  `create_time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `idx_combination1` (`user_name`,`money`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

原表总记录数:
mysql> select count(*) from t_group;
+----------+
| count(*) |
+----------+
| 10485760 |
+----------+
1 row in set (0.00 sec)
分页表:


CREATE TABLE `t_group_ids` (
  `id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`,`group_id`),
  KEY `idx_id` (`id`),
  KEY `idx_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


插入分页表数据。当然这里如果你的表主键不是ID,那你得自己想办法搞这个分页表的数据了。这个好实现,就不说了。
mysql> insert into t_group_ids select ceil(id/20),id from t_group;
Query OK, 10485760 rows affected (2 min 56.19 sec)
Records: 10485760  Duplicates: 0  Warnings: 0

现在来看看对比数据。

用普通LIMIT来实现分页。
mysql> select * from t_group where 1 limit 20;
+----+--------+-----------+---------------------+
| id | money  | user_name | create_time         |
+----+--------+-----------+---------------------+
|  1 |  50.23 | david     | 2008-10-23 12:55:49 |
|  2 |  55.23 | livia     | 2008-10-23 10:02:09 |
|  3 | 100.83 | leo       | 2008-10-23 10:02:22 |
|  4 |  99.99 | lucy      | 2008-10-23 10:02:39 |
|  5 | 299.99 | simon     | 2008-10-23 10:02:52 |
|  6 | 599.99 | sony      | 2008-10-23 10:03:03 |
|  7 | 599.99 | rick      | 2008-10-23 10:03:12 |
|  8 |   9.99 | anne      | 2008-10-23 10:03:47 |
|  9 |   9.99 | sarah     | 2008-10-23 10:04:31 |
| 10 | 900.99 | john      | 2008-10-23 10:04:50 |
| 11 |   0.23 | david     | 2008-10-23 10:05:31 |
| 12 |   5.23 | livia     | 2008-10-23 10:05:31 |
| 13 |  50.83 | leo       | 2008-10-23 10:05:31 |
| 14 |  49.99 | lucy      | 2008-10-23 10:05:31 |
| 15 | 249.99 | simon     | 2008-10-23 10:05:31 |
| 16 | 549.99 | sony      | 2008-10-23 10:05:31 |
| 17 | 549.99 | rick      | 2008-10-23 10:05:31 |
| 18 | -40.01 | anne      | 2008-10-23 10:05:31 |
| 19 | -40.01 | sarah     | 2008-10-23 10:05:31 |
| 20 | 850.99 | john      | 2008-10-23 10:05:31 |
+----+--------+-----------+---------------------+
20 rows in set (0.01 sec)


用分页表来实现分页。

mysql> select a.* from t_group as a inner join t_group_ids as b where a.id = b.g
roup_id and b.id = 1;
+----+--------+-----------+---------------------+
| id | money  | user_name | create_time         |
+----+--------+-----------+---------------------+
|  1 |  50.23 | david     | 2008-10-23 12:55:49 |
|  2 |  55.23 | livia     | 2008-10-23 10:02:09 |
|  3 | 100.83 | leo       | 2008-10-23 10:02:22 |
|  4 |  99.99 | lucy      | 2008-10-23 10:02:39 |
|  5 | 299.99 | simon     | 2008-10-23 10:02:52 |
|  6 | 599.99 | sony      | 2008-10-23 10:03:03 |
|  7 | 599.99 | rick      | 2008-10-23 10:03:12 |
|  8 |   9.99 | anne      | 2008-10-23 10:03:47 |
|  9 |   9.99 | sarah     | 2008-10-23 10:04:31 |
| 10 | 900.99 | john      | 2008-10-23 10:04:50 |
| 11 |   0.23 | david     | 2008-10-23 10:05:31 |
| 12 |   5.23 | livia     | 2008-10-23 10:05:31 |
| 13 |  50.83 | leo       | 2008-10-23 10:05:31 |
| 14 |  49.99 | lucy      | 2008-10-23 10:05:31 |
| 15 | 249.99 | simon     | 2008-10-23 10:05:31 |
| 16 | 549.99 | sony      | 2008-10-23 10:05:31 |
| 17 | 549.99 | rick      | 2008-10-23 10:05:31 |
| 18 | -40.01 | anne      | 2008-10-23 10:05:31 |
| 19 | -40.01 | sarah     | 2008-10-23 10:05:31 |
| 20 | 850.99 | john      | 2008-10-23 10:05:31 |
+----+--------+-----------+---------------------+
20 rows in set (0.00 sec)



取第50W页的数据。
原来表:
mysql> select * from t_group where 1 limit 9999980,20;
+----------+---------+-----------+---------------------+
| id       | money   | user_name | create_time         |
+----------+---------+-----------+---------------------+
|  9999981 |  810.13 | david     | 2008-10-23 10:09:24 |
|  9999982 |  815.13 | livia     | 2008-10-23 10:09:24 |
|  9999983 |  860.73 | leo       | 2008-10-23 10:09:24 |
|  9999984 |  859.89 | lucy      | 2008-10-23 10:09:24 |
|  9999985 | 1059.89 | simon     | 2008-10-23 10:09:24 |
|  9999986 | 1359.89 | sony      | 2008-10-23 10:09:24 |
|  9999987 | 1359.89 | rick      | 2008-10-23 10:09:24 |
|  9999988 |  769.89 | anne      | 2008-10-23 10:09:24 |
|  9999989 |  769.89 | sarah     | 2008-10-23 10:09:24 |
|  9999990 | 1660.89 | john      | 2008-10-23 10:09:24 |
|  9999991 |  760.13 | david     | 2008-10-23 10:09:24 |
|  9999992 |  765.13 | livia     | 2008-10-23 10:09:24 |
|  9999993 |  810.73 | leo       | 2008-10-23 10:09:24 |
|  9999994 |  809.89 | lucy      | 2008-10-23 10:09:24 |
|  9999995 | 1009.89 | simon     | 2008-10-23 10:09:24 |
|  9999996 | 1309.89 | sony      | 2008-10-23 10:09:24 |
|  9999997 | 1309.89 | rick      | 2008-10-23 10:09:24 |
|  9999998 |  719.89 | anne      | 2008-10-23 10:09:24 |
|  9999999 |  719.89 | sarah     | 2008-10-23 10:09:24 |
| 10000000 | 1610.89 | john      | 2008-10-23 10:09:24 |
+----------+---------+-----------+---------------------+
20 rows in set (4.21 sec)

分页表:

mysql> select a.* from t_group as a inner join t_group_ids as b where a.id = b.g
roup_id and b.id = 500000;
+----------+---------+-----------+---------------------+
| id       | money   | user_name | create_time         |
+----------+---------+-----------+---------------------+
|  9999981 |  810.13 | david     | 2008-10-23 10:09:24 |
|  9999982 |  815.13 | livia     | 2008-10-23 10:09:24 |
|  9999983 |  860.73 | leo       | 2008-10-23 10:09:24 |
|  9999984 |  859.89 | lucy      | 2008-10-23 10:09:24 |
|  9999985 | 1059.89 | simon     | 2008-10-23 10:09:24 |
|  9999986 | 1359.89 | sony      | 2008-10-23 10:09:24 |
|  9999987 | 1359.89 | rick      | 2008-10-23 10:09:24 |
|  9999988 |  769.89 | anne      | 2008-10-23 10:09:24 |
|  9999989 |  769.89 | sarah     | 2008-10-23 10:09:24 |
|  9999990 | 1660.89 | john      | 2008-10-23 10:09:24 |
|  9999991 |  760.13 | david     | 2008-10-23 10:09:24 |
|  9999992 |  765.13 | livia     | 2008-10-23 10:09:24 |
|  9999993 |  810.73 | leo       | 2008-10-23 10:09:24 |
|  9999994 |  809.89 | lucy      | 2008-10-23 10:09:24 |
|  9999995 | 1009.89 | simon     | 2008-10-23 10:09:24 |
|  9999996 | 1309.89 | sony      | 2008-10-23 10:09:24 |
|  9999997 | 1309.89 | rick      | 2008-10-23 10:09:24 |
|  9999998 |  719.89 | anne      | 2008-10-23 10:09:24 |
|  9999999 |  719.89 | sarah     | 2008-10-23 10:09:24 |
| 10000000 | 1610.89 | john      | 2008-10-23 10:09:24 |
+----------+---------+-----------+---------------------+
20 rows in set (0.03 sec)


我们来取最后一页的数据。
原表:

mysql> select * from t_group where 1 limit 10485740,20;
+----------+---------+-----------+---------------------+
| id       | money   | user_name | create_time         |
+----------+---------+-----------+---------------------+
| 10485741 | 1935.42 | david     | 2008-10-23 10:09:24 |
| 10485742 | 1955.42 | livia     | 2008-10-23 10:09:24 |
| 10485743 | 2137.82 | leo       | 2008-10-23 10:09:24 |
| 10485744 | 2134.46 | lucy      | 2008-10-23 10:09:24 |
| 10485745 | 2934.46 | simon     | 2008-10-23 10:09:24 |
| 10485746 | 4134.46 | sony      | 2008-10-23 10:09:24 |
| 10485747 | 4134.46 | rick      | 2008-10-23 10:09:24 |
| 10485748 | 1774.46 | anne      | 2008-10-23 10:09:24 |
| 10485749 | 1774.46 | sarah     | 2008-10-23 10:09:24 |
| 10485750 | 5338.46 | john      | 2008-10-23 10:09:24 |
| 10485751 | 1735.42 | david     | 2008-10-23 10:09:24 |
| 10485752 | 1755.42 | livia     | 2008-10-23 10:09:24 |
| 10485753 | 1937.82 | leo       | 2008-10-23 10:09:24 |
| 10485754 | 1934.46 | lucy      | 2008-10-23 10:09:24 |
| 10485755 | 2734.46 | simon     | 2008-10-23 10:09:24 |
| 10485756 | 3934.46 | sony      | 2008-10-23 10:09:24 |
| 10485757 | 3934.46 | rick      | 2008-10-23 10:09:24 |
| 10485758 | 1574.46 | anne      | 2008-10-23 10:09:24 |
| 10485759 | 1574.46 | sarah     | 2008-10-23 10:09:24 |
| 10485760 | 5138.46 | john      | 2008-10-23 10:09:24 |
+----------+---------+-----------+---------------------+
20 rows in set (4.88 sec)

分页表:

mysql> select a.* from t_group as a inner join t_group_ids as b where a.id = b.g
roup_id and b.id = 524288;
+----------+---------+-----------+---------------------+
| id       | money   | user_name | create_time         |
+----------+---------+-----------+---------------------+
| 10485741 | 1935.42 | david     | 2008-10-23 10:09:24 |
| 10485742 | 1955.42 | livia     | 2008-10-23 10:09:24 |
| 10485743 | 2137.82 | leo       | 2008-10-23 10:09:24 |
| 10485744 | 2134.46 | lucy      | 2008-10-23 10:09:24 |
| 10485745 | 2934.46 | simon     | 2008-10-23 10:09:24 |
| 10485746 | 4134.46 | sony      | 2008-10-23 10:09:24 |
| 10485747 | 4134.46 | rick      | 2008-10-23 10:09:24 |
| 10485748 | 1774.46 | anne      | 2008-10-23 10:09:24 |
| 10485749 | 1774.46 | sarah     | 2008-10-23 10:09:24 |
| 10485750 | 5338.46 | john      | 2008-10-23 10:09:24 |
| 10485751 | 1735.42 | david     | 2008-10-23 10:09:24 |
| 10485752 | 1755.42 | livia     | 2008-10-23 10:09:24 |
| 10485753 | 1937.82 | leo       | 2008-10-23 10:09:24 |
| 10485754 | 1934.46 | lucy      | 2008-10-23 10:09:24 |
| 10485755 | 2734.46 | simon     | 2008-10-23 10:09:24 |
| 10485756 | 3934.46 | sony      | 2008-10-23 10:09:24 |
| 10485757 | 3934.46 | rick      | 2008-10-23 10:09:24 |
| 10485758 | 1574.46 | anne      | 2008-10-23 10:09:24 |
| 10485759 | 1574.46 | sarah     | 2008-10-23 10:09:24 |
| 10485760 | 5138.46 | john      | 2008-10-23 10:09:24 |
+----------+---------+-----------+---------------------+
20 rows in set (0.01 sec)

这篇关于LIMIT page_no,page_total分页的优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748814

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio

MySQL中慢SQL优化方法的完整指南

《MySQL中慢SQL优化方法的完整指南》当数据库响应时间超过500ms时,系统将面临三大灾难链式反应,所以本文将为大家介绍一下MySQL中慢SQL优化的常用方法,有需要的小伙伴可以了解下... 目录一、慢SQL的致命影响二、精准定位问题SQL1. 启用慢查询日志2. 诊断黄金三件套三、六大核心优化方案方案

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

mybatis-plus分页无效问题解决

《mybatis-plus分页无效问题解决》本文主要介绍了mybatis-plus分页无效问题解决,原因是配置分页插件的版本问题,旧版本和新版本的MyBatis-Plus需要不同的分页配置,感兴趣的可... 昨天在做一www.chinasem.cn个新项目使用myBATis-plus分页一直失败,后来经过多方

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4