测试数据表结构
现在有两张表 customer,以及order_test, customerId的主键是order_test的外键
CREATE TABLE `customer` ( `customerId` int(11) NOT NULL AUTO_INCREMENT, `phone` varchar(11) NOT NULL COMMENT '手机号', `password` varchar(20) NOT NULL COMMENT '密码', PRIMARY KEY (`customerId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE `order_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `orderNo` char(17) COLLATE utf8_bin NOT NULL, `customerId` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `111_idx` (`customerId`), CONSTRAINT `111` FOREIGN KEY (`customerId`) REFERENCES `customer` (`customerId`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=100880001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
customer表又1亿多条数据,order_test有9000w条数据.
下面针对上面两张表做一些常用的语句进行优化
limit 分页优化方法
explain用法详见: http://zcf9916.iteye.com/blog/2409731
1.假设现在要查处customer表的按customerId排序的第500000到500200中的200条数据
正常的写法就是这样
SELECT customerId FROM customer LIMIT 500000,200; 执行时间是0.108秒
这个语句会查出前500200条数据,然后再丢弃前500000条数据,所以速度很慢
执行explain + sql,可以看到type=all,进行了全表扫描
- id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
- +----+-------------+---------+------+---------------+------+---------+------+--------+----------+-------+
- | 1 | SIMPLE | customer | ALL | NULL | NULL | NULL | NULL | 99808800 | 100.00 | |
如果limit 后面只有一个数字,limit 200,那么数据库只会扫描这两百条,所以我们可以从这里入手.
1. 假设id是递增的,且数据没有删除,
建立主键或唯一索引, 利用索引(假设每页10条)
---语句样式:mysql中,可用如下方法: SELECT * FROM customer WHERE customerId > 500000 LIMIT 200,执行时间0.0032秒
---适应场景: 适用于数据量多的情况(元组数上万)
---原因: 索引扫描,速度会很快.
执行explain + sql,可以看到type=range, possible_keys=primary 说明使用了主键索引
- (ps: range:只检索给定范围的行,使用一个索引来选择行。)
- id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
- +----+-------------+---------+------+---------------+------+---------+------+--------+----------+-------+
- | 1 | SIMPLE | customer | range | PRIMARY | PRIMARY | 4 | NULL | 49808800 | 100.00 |
2.假设id是递增的,且有数据被删除过,假设第499800-499999数据被删除过,那么就不能单纯的靠customerId > 500000来定位了,因为实际id范围是50020-500400了.
---语句样式:可用如下方法: SELECT * FROM customer WHERE customerId >=
(SELECT customerId FROM customer order by customerId LIMIT 500000,1) ORDER BY customerId LIMIT 200
- id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
- +----+-------------+---------+------+---------------+------+---------+------+--------+----------+-------+
- | 1 | PRIMARY | customer | range | PRIMARY | PRIMARY | 4 | NULL | 49808800 | 100.00 | using where
- | 2 | SUBQUERY | customer | index | | PRIMARY | 4 | NULL | 500001 | 100.00 | using index
PS:如果limit offset,数量. 如果offset值过大,那么查询时间还是会很长,所以当offset超过一定量的时候,最好就不做处理。
PS:在实验中发现 。SELECT customerId FROM customer order by customerId LIMIT 0,20;和SELECT customerId FROM customer LIMIT 0,20;虽然cutomer是递增的,但是两句话的结果可能不同,因为不加order就会根据索引的指针顺序去访问,不一定是按顺序来的.
相关推荐
4. **MySQL分页工具** 在实际开发中,许多开发者会选择使用ORM(对象关系映射)框架,如Hibernate、MyBatis等,它们通常提供封装好的分页API,简化了数据库分页的操作。同时,也有一些数据库管理工具,如MySQL ...
MySQL中的分页查询是Web应用中常见的操作,但随着数据量的增长,`LIMIT`语句在处理大量数据时性能会显著下降。特别是当`OFFSET`值增大时,MySQL需要扫描更多的行来找到需要的数据,这可能导致查询速度变慢,甚至对...
MySQL 千万级快速分页优化方案 在实际开发中,我们经常会遇到 MySQL 数据库的性能问题,特别是在处理千万级数据时,分页查询的性能会变得非常慢。在这篇文章中,我们将探讨如何优化 MySQL 千万级快速分页,详细介绍...
2. **分页查询**:Oracle使用ROWNUM进行分页,而MySQL通常使用LIMIT和OFFSET。在转换过程中,需要将Oracle的ROWNUM替换为MySQL的LIMIT子句。 3. **连接查询**:Oracle的JOIN语法允许在ON条件中使用子查询,而在...
总结来说,实现高效的MySQL分页查询需要考虑索引优化、使用新的SQL特性,以及借助合适的开发工具。同时,持续关注数据库性能监控,及时调整和优化查询策略,对于保持系统稳定和提升用户体验具有重要意义。
Mysql的分页的两个参数 select * from user limit 1,2 ... 您可能感兴趣的文章:详解MySQL的limit用法和分页查询语句的性能分析MYSQL分页limit速度太慢的优化方法mysql limit分页优化方法分享Mysql limit
总结,MySQL的分页功能是处理大数据量查询的关键技术,通过合理使用`LIMIT`和`OFFSET`,配合索引优化,可以有效地提高查询效率,提升用户交互体验。同时,随着版本升级,MySQL提供了更多分页策略和技术,如窗口函数...
根据提供的文件信息,我们可以推断出本教程主要围绕MySQL语句性能优化展开,这是一项非常重要的数据库管理技能,尤其对于那些处理大量数据的应用程序来说至关重要。下面将详细阐述与MySQL语句性能优化相关的知识点。...
分页可以有效提高页面的响应速度,并优化用户的浏览体验。本文主要介绍了在Node.js环境下,如何使用MySQL数据库实现分页功能。 首先,分页的基本思路是确定每页显示的数据条目数(即页面大小),然后根据当前页码...
本示例中,我们将探讨如何在WinForm应用程序中实现MySQL数据库的分页功能,这在处理大量数据时非常实用,可以提高用户体验并减少系统资源的消耗。 首先,我们需要在Visual Studio 2010中创建一个新的WinForm项目。...
【JSP+MySQL分页组件】是Web开发中常见的功能,用于处理大量数据时提高页面加载速度和用户体验。在Web应用程序中,一次性加载所有数据可能导致页面响应慢,尤其是在数据库存储的数据量庞大的情况下。分页技术可以...
分页程序原理很简单,这里就不多说了,本篇文章主要说的是在数据表记录量比较大的情况下,如何将分页SQL做到更优化,让MySQL执行的更快的方法。
Java 连接数据库的分页语句主要包括连接 Oracle、SQL Server 和 MySQL 数据库的语句,以及连接这些数据库的分页语句。 连接 Oracle 数据库的语句: 使用 Oracle 数据库时,需要使用 Oracle 的 JDBC 驱动程序。首先...
传统的mysql分页查询 select * from table limit n , m MySQL 执行此类SQL时需要先分页(默认一页1000条数据)通过全表扫描到N行,然后再去取M行。对于此类操作,获取前面少数几行数据会很快,但是随着扫描的记录数越...
本资源"PHP MYSQL分页代码"提供了一个实用的解决方案,结合了PHP和MySQL两种技术来实现高效的数据分页功能。 首先,让我们深入了解PHP和MySQL在分页中的角色。PHP是一种广泛使用的服务器端脚本语言,常用于动态网站...
### ASP与MySQL分页技术详解 #### 一、引言 在Web开发中,当数据量庞大时,一次性展示所有数据不仅会导致页面加载缓慢,还会严重影响用户体验。因此,实现数据的分页显示变得尤为重要。本文将详细介绍如何在ASP...
这个"封装好的php+mysql分页类"提供了一种高效且可复用的方法来实现这一目标。以下是对该分页类的详细解析: 1. **类结构**: 分页类通常包含一些关键属性,如每页显示的记录数($limit)、当前页数($currentPage...
本篇文章将深入探讨如何利用C++实现MySQL的分页查询功能,这对于处理大量数据时提高系统性能和用户体验至关重要。 首先,我们需要引入MFC(Microsoft Foundation Classes)库,这是一个由Microsoft为Windows平台...
在这个"mysql分页实例"中,我们将深入探讨MySQL的分页查询技术,并提供可以直接引用的分页类。 首先,我们要理解SQL中的基础分页查询语句。在MySQL中,最常用的分页查询方法是结合`LIMIT`和`OFFSET`关键字。`LIMIT`...
数据库分页是数据库管理系统中一个重要的查询技术,用于在大量数据中实现高效...理解并掌握这些分页语句对于开发高效率、高性能的数据库应用至关重要。在实际应用中,应根据数据库类型和具体需求选择最适合的分页策略。