最近在生产上遇见一个分页查询特别慢的问题,数据量大概有200万的样子,翻到最后一页性能很低,差不多得有4秒的样子才能出来整个页面,需要进行查询优化。
第一步,找到执行慢的sql,如下:
SELECT
shotel_id as hotelId,
mroom_type_id as mroomTypeId,
available_date as availableDate,
result_status as resultStatus,
create_time as createTime,
operate_time as operateTime
FROM autofs_ivr
ORDER BY shotel_id
LIMIT 1983424, 20
explain一下:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE autofs_ivr ALL None None None None 1875402 Using file sort
观察可见,type为all,走了全表扫描,extra是using file sort,不是索引覆盖。
其中select语句选中的列除了shotel_id剩余均不在order by的列里面,而shotel_id列上面有一个索引,所以这个sql并没有走索引覆盖,每次根据二级索引查询到一条记录,都要再走一遍主键索引去表里找出所需要的其他列,速度自然慢。
有什么办法可以优化一下这个limit分页查询呢?《高性能mysql》当中提到了一种“延迟关联”技术,可以优化这句sql,优化后的语句如下:
SELECT
shotel_id as hotelId,
mroom_type_id as mroomTypeId,
available_date as availableDate,
result_status as resultStatus,
operate_time as operateTime,
create_time as createTime
FROM autofs_ivr
inner join(
select id
from autofs_ivr
ORDER BY shotel_id
LIMIT 1983424, 20
) as lim using(id));
explain结果如下:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY ALL None None None None 20
1 PRIMARY autofs_ivr eq_ref PRIMARY PRIMARY 4 lim.id 1
2 DERIVED autofs_ivr index None ix_sh_mr 124 None 1875402 Using index
子查询中,使用索引覆盖技术,查出20条记录,再通过主键和表本身做关联,即使走了全表扫描,访问记录也不过20条,查询时间降为400毫秒,提升速度10倍。
分享到:
相关推荐
本实例展示了如何使用JSP、MYSQL和Java类实现一个优化的分页功能。通过合理的数据库查询策略和分页算法,能够在不牺牲用户体验的前提下处理大量数据。此外,良好的代码结构和注释也有助于代码的可读性和维护性。在...
这通常是一个Java类,用于处理数据库分页查询的逻辑。它可能包含方法如`getPageData(int pageNum, int pageSize)`,用于接收当前页码和每页大小,然后构建对应的SQL语句并执行,返回分页后的数据。这个类还可能有...
Node.js结合MySQL实现分页查询是一种常见的数据处理方式,在Web应用中尤为常见...通过这篇文章的学习,我们可以了解到在Node.js应用中如何结合MySQL数据库来实现分页功能,这对于Web开发人员来说是一个非常实用的技能。
MySQL数据库在处理大量数据时,为了提高用户体验,通常会采用分页的方式来展示结果。分页是一种有效的优化策略,它避免了一次性加载所有数据...通过学习和实践这个"mysql分页实例",你将能够更好地理解和应用这些技巧。
在这个"SSH+Mysql无刷新分页实例"中,我们将探讨如何利用SSH框架与MySQL数据库实现网页的无刷新分页功能,从而提高用户体验。 首先,SSH框架中的Spring负责控制层,它提供依赖注入(Dependency Injection,DI)和...
为了更好地理解上述问题,并提供针对性的解决方案,接下来将通过具体的实例来展示如何优化MySQL的分页查询性能。 ### 实例分析 #### 数据表结构 假设有一个名为`collect`的数据表,包含以下字段:`id`, `title`, ...
在这个"MySQL_数据库实现的JAVA_分页实例"中,我们将探讨如何在Java后端实现对MySQL数据库的分页查询,这对于大数据量的展示和优化用户体验至关重要。 首先,理解分页的基本概念:分页是将大量数据分为多个小部分,...
在SQL语句中,LIMIT用于限制查询结果的数量,它接受一个或两个数字参数,表示从哪一条记录开始查询,以及要查询的记录数。具体使用方式如下: - LIMIT [offset,] row_count - offset:可选,指定从哪一条记录开始...
总的来说,这个资源包提供了一个SSM环境下,结合MySQL和Oracle数据库进行分页查询的实例,对于初学者理解SSM框架与数据库的交互,以及掌握分页查询的实现方法,是非常有价值的参考资料。在实际项目中,合理利用分页...
本文将深入探讨如何优化MySQL中的LIMIT分页查询,以提高数据库查询效率。 首先,理解LIMIT的工作原理至关重要。LIMIT用于指定返回结果集的数量,通常与ORDER BY一起使用,以确定返回哪一部分数据。当OFFSET值较大时...
三、分页实例 假设我们有一个名为`students`的表,包含`id`(主键,自增),`name`和`age`字段,现在要查询第3页,每页显示10条记录,那么SQL语句如下: ```sql SELECT * FROM students ORDER BY id ASC LIMIT 20, ...
综上所述,MyBatis结合MySQL的分页查询是一个实用且常见的技术应用场景。通过合理的设计和实现,开发者可以有效地管理和展示大数据集,提高系统的响应速度和用户体验。在实际开发过程中,要根据项目需求和数据规模...
在本文中,我们将深入探讨如何使用Node.js、Express框架和MySQL数据库来构建一个功能完备的Web应用程序,包括数据的增删改查(CRUD)操作、分页功能以及图片的上传处理。首先,我们先来了解这三个核心组件。 **Node...
本文将深入探讨如何利用Spring的JdbcTemplate进行MySQL数据库的分页查询,并对其进行封装,提高代码的复用性和可维护性。 首先,了解Spring JdbcTemplate的基本用法。JdbcTemplate是Spring提供的一个模板类,用于...
总结,这个实例展示了如何在Web应用中实现模糊查询和分页功能,通过jsp页面接收用户输入,servlet处理查询逻辑,利用MySQL数据库的模糊匹配和分页查询功能。这只是一个基本的示例,实际项目中还需要考虑错误处理、...
然后,创建一个服务类的实例,调用其分页查询方法,并传递这些参数。 3. **设计MyBatis映射文件**:在MyBatis的映射文件中,定义一个包含分页条件的SQL查询。可以使用`limit`或`offset`来实现分页,具体语法取决于...
例如,一个简单的SQL查询可能如下: ```sql SELECT * FROM table_name LIMIT (pageNo - 1) * pageSize, pageSize; ``` 其中,`pageNo`是当前页码,`pageSize`是每页的记录数。 **二、假分页** 假分页(Virtual ...
总的来说,"Mysql+分页-DEMO.rar" 提供了一个在Delphi7环境下使用MySQL实现分页查询的实例,这对于学习如何在桌面应用程序中有效地管理大量数据是非常有价值的。通过这个DEMO,开发者可以了解和实践如何整合数据库...
本文将深入探讨MySQL中的通用分页实现,并结合实例进行解析。 首先,我们需要了解SQL中的基本分页查询语句。在MySQL中,最常用的分页查询方法是结合`LIMIT`和`OFFSET`关键字。`LIMIT`用于指定每页显示的数据量,而`...
- 跳转输入框:提供一个输入框让用户直接输入页码跳转,提高操作便捷性。 9. **错误处理**: 类应包含适当的错误处理机制,当SQL查询失败或分页参数不正确时,能提供有用的错误信息。 总的来说,这个"封装好的...