在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用orderby排 序。但是在表数据量比较大的时候,例如查询语句片段limit 10000, 20,数据库会读取10020条数据,然后把前10000条丢弃,把最后的20条返回给你,这种消耗是可以避免的,也是没必要的。下边介绍几种优化方法:
优化方法1(让分页操作在索引中进行):
一般表中经常作为条件查询的列都会建立索引,例如如下查询
Sql代码
SELECT msg_id, msg_content FROM message ORDER BY gmt_create desc LIMIT 100, 20;
可以写成如下方式
Sql代码
SELECT msg_id, msg_content FROM message
INNER JOIN (
SELECT msg_id FROM message
ORDER BY gmt_create LIMIT 100, 20
) AS page USING(msg_id);
这样当前查询页的内容就只会在索引中进行,当得到当前页的msg_id再统一通过一个INNER JOIN得到最终要得到的数据详情,避免了对大量数据详情进行操作的消耗。当然JOIN操作也可以通过子查询实现,不过书中介绍5.6之前版本的 mysql相比子查询还是优先使用JOIN。
优化方法2(显式指定要查询的索引列范围)
例如方法一中的gmt_create是建立索引的列,而且你也知道要查询的时间范围,这样你就可以通过如下查询语句:
Sql代码
SELECT msg_id, msg_content FROM message
WHERE gmt_create BETWEEN #startTime# AND #endTime#
ORDER BY gmt_create desc
这样数据库通过一个范围查询就可以得到想要的数据。
优化方法3(OFFSET作为查询条件显式指定)
例子还是如上,我们可以在查询参数中显式指定一个查询时间,叫做lastVisitTime吧。我们查询第一页可以用如下语句:
Sql代码
SELECT msg_id, msg_content FROM message
ORDER BY gmt_create desc
LIMIT 20
我们把读出来的数据的最后一条数据的gmt_create字段记录在lastVisitTime字段中,那么后边页的查询就可以用如下语句实现:
Sql代码
SELECT msg_id, msg_content FROM message
WHERE gmt_create < #lastVisitTime#
ORDER BY gmt_create desc
LIMIT 20;
这种查询方式,无论你查询多少页,分页都不会是影响效率的因素。
- 浏览: 7188781 次
- 性别:
- 来自: 北京
最新评论
-
bukebuhao:
已解决,打开文件太多。ulimit -n 上次临时生效后再次s ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
bukebuhao:
ds重启后启动不了。报错信息如下,请大神帮助[2018-08- ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
墨上清:
感谢,看完有了一个完整的知识网络。
Spring MVC 教程,快速入门,深入分析 -
云卷云舒灬:
谢谢,学到很多
Spring MVC 教程,快速入门,深入分析 -
luozhy:
非常感谢非常感谢
Project Web Access ActiveX控件 安装
相关推荐
对于大数据集,建议使用`ORDER BY`结合`LIMIT`优化查询,避免使用大的偏移量。 2. **效率优化**:如果查询中包含`ORDER BY`,应尽可能减少`OFFSET`值,因为`ORDER BY`会增加额外的计算成本。 3. **不确定性**:当...
这个压缩包文件名"JAVA JAP分页写法大全"暗示了它可能包含各种不同的分页实现示例,这对于初学者来说是一个极好的学习资源。下面我们将详细探讨Java中常见的分页方法。 首先,我们要理解分页的基本概念。在处理大量...
然而,传统的LIMIT分页方法在翻页到后几页时可能会遇到性能瓶颈。 **普通写法示例:** ```sql SELECT * FROM sys_info.jdp_tb_trade WHERE seller_nick = 'xuancan' AND jdp_modified >= '2012-09-18 16:00:01' AND...
在DB2中,`WITH UR` 是一个用于优化查询性能的选项,它表示“无需恢复”(Without Recovery),意味着读取的数据可能不是最新的。在MySQL中并没有直接等价的功能。因此,在迁移过程中,如果涉及到`WITH UR`的使用,则...
7. **实际项目中的适应性**:在实际项目中,可能需要根据数据库类型和具体需求调整分页SQL的写法,例如Oracle支持ROWNUM,而MySQL则可以使用LIMIT和OFFSET。 **优化技巧**: 1. **缓存**:对于不经常变动的数据,...
7. **执行分页查询**:构造分页SQL查询,使用计算出的偏移量和每页记录数,然后用`mysql_query()`执行查询。 8. **显示数据**:通过`mysql_fetch_array()`遍历查询结果,获取每页需要显示的数据,并将其展示在网页...
例如“LIMIT(n-1)*count, count”,其中(n-1)*count计算起始位置,count表示每页显示的条数,这种写法可以实现数据的分页查询。 3. 别名:在SQL查询中使用别名可以简化SQL语句的复杂性,并使得输出结果的列名更加...
同样地,如果你想在 MySQL 中模拟 Oracle 的分页查询,Oracle 原版写法如下: ```sql SELECT * FROM ( SELECT id, name FROM t ) WHERE ROWNUM (num); ``` 在 MySQL 中,你可以使用以下方式实现: ```sql SET @...
MySQL中的`LIMIT`子句是查询语句的重要组成部分,它允许你限制返回的数据行数,这对于数据分页、获取特定范围的数据或者优化大数据查询非常有用。`LIMIT`的基本语法是`LIMIT [offset,] rows`或者`LIMIT rows OFFSET ...
在数据库管理领域,Oracle和MySQL是两种广泛应用的关系型数据库管理系统(RDBMS)。它们在处理主键、索引和分页方面存在一些显著的区别,这些差异对于...理解这些差异有助于优化查询性能,提高数据库系统的整体效率。
- MySQL使用`LIMIT`关键字进行分页,如`SELECT * FROM table LIMIT m, n`。 5. **日期转换函数**: - Oracle的`TO_CHAR`和`TO_DATE`对应MySQL的`DATE_FORMAT`和`STR_TO_DATE`,需注意格式字符串的对应。 - ...
使用`LIMIT`关键字进行分页查询,指定从哪个位置开始查询以及查询多少条记录。 8. **处理查询结果并显示:** ```php while ($row = mysql_fetch_assoc($result)) { echo "<pre>"; echo $row["xnhost_id"]; ...
`LIMIT`子句用于限制查询结果的数量,常用于分页显示数据。 - **语法示例**: ```sql SELECT * FROM article LIMIT 100, -1; ``` 这条语句的写法不太常见,通常的格式应该是`LIMIT [OFFSET, ]ROWS`。如果按照...
- MySQL的`LIMIT`子句可以轻松实现分页,如`SELECT * FROM table LIMIT m, n`。Oracle中通常使用子查询结合`ROWNUM`来达到相同效果。 5. **日期和时间函数**: - Oracle的`TO_CHAR`和`TO_DATE`分别对应MySQL的`...
- MySQL使用`LIMIT`关键字进行分页,如`LIMIT m, n`,从第m+1条开始取n条数据。 5. **函数转换**: - 日期转换:Oracle的`TO_CHAR`和`TO_DATE`在MySQL中对应`DATE_FORMAT`和`STR_TO_DATE`,需注意时间格式的一致...
MySQL中通常使用`LIMIT`关键字来实现分页查询,例如: ```sql SELECT * FROM table_name LIMIT 10 OFFSET 20; ``` 而在Oracle中,则使用`ROWNUM`来进行分页,如下所示: ```sql SELECT * FROM ( SELECT ROWNUM ...
- 在查询时使用`LIMIT`来分页获取结果,减少数据传输量。 #### 四、优化之SQL数据库 1. **系统调优参数** - `back_log`:用于设置当连接数达到最大值时,还可以有多少个连接请求被放入队列等待。可以根据实际...