`

mysql 分页语句优化

 
阅读更多

 测试数据表结构

 

   现在有两张表   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,进行了全表扫描 

  1. id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra | 
  2. +----+-------------+---------+------+---------------+------+---------+------+--------+----------+-------+ 
  3. |  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:只检索给定范围的行,使用一个索引来选择行。)
  1. id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra | 
  2. +----+-------------+---------+------+---------------+------+---------+------+--------+----------+-------+ 
  3. |  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

   

  1. id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra | 
  2. +----+-------------+---------+------+---------------+------+---------+------+--------+----------+-------+ 
  3. |  1 | PRIMARY      | customer | range  | PRIMARY   | PRIMARY | 4    | NULL | 49808800 |   100.00 |   using where    
  4. |  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就会根据索引的指针顺序去访问,不一定是按顺序来的.

 

 

分享到:
评论

相关推荐

    MySQL分页实现

    4. **MySQL分页工具** 在实际开发中,许多开发者会选择使用ORM(对象关系映射)框架,如Hibernate、MyBatis等,它们通常提供封装好的分页API,简化了数据库分页的操作。同时,也有一些数据库管理工具,如MySQL ...

    MYSQL分页limit速度太慢的优化方法

    MySQL中的分页查询是Web应用中常见的操作,但随着数据量的增长,`LIMIT`语句在处理大量数据时性能会显著下降。特别是当`OFFSET`值增大时,MySQL需要扫描更多的行来找到需要的数据,这可能导致查询速度变慢,甚至对...

    如何优化Mysql千万级快速分页

    MySQL 千万级快速分页优化方案 在实际开发中,我们经常会遇到 MySQL 数据库的性能问题,特别是在处理千万级数据时,分页查询的性能会变得非常慢。在这篇文章中,我们将探讨如何优化 MySQL 千万级快速分页,详细介绍...

    Oracle Sql语句转换成Mysql Sql语句

    2. **分页查询**:Oracle使用ROWNUM进行分页,而MySQL通常使用LIMIT和OFFSET。在转换过程中,需要将Oracle的ROWNUM替换为MySQL的LIMIT子句。 3. **连接查询**:Oracle的JOIN语法允许在ON条件中使用子查询,而在...

    高效的MySQL分页

    总结来说,实现高效的MySQL分页查询需要考虑索引优化、使用新的SQL特性,以及借助合适的开发工具。同时,持续关注数据库性能监控,及时调整和优化查询策略,对于保持系统稳定和提升用户体验具有重要意义。

    mysql分页的limit参数简单示例

    Mysql的分页的两个参数 select * from user limit 1,2 ... 您可能感兴趣的文章:详解MySQL的limit用法和分页查询语句的性能分析MYSQL分页limit速度太慢的优化方法mysql limit分页优化方法分享Mysql limit

    mysql数据库实现分页

    总结,MySQL的分页功能是处理大数据量查询的关键技术,通过合理使用`LIMIT`和`OFFSET`,配合索引优化,可以有效地提高查询效率,提升用户交互体验。同时,随着版本升级,MySQL提供了更多分页策略和技术,如窗口函数...

    【36】最新精选蚂蚁-MySQL语句性能优化视频教程下载 .txt

    根据提供的文件信息,我们可以推断出本教程主要围绕MySQL语句性能优化展开,这是一项非常重要的数据库管理技能,尤其对于那些处理大量数据的应用程序来说至关重要。下面将详细阐述与MySQL语句性能优化相关的知识点。...

    nodejs mysql 实现分页的方法

    分页可以有效提高页面的响应速度,并优化用户的浏览体验。本文主要介绍了在Node.js环境下,如何使用MySQL数据库实现分页功能。 首先,分页的基本思路是确定每页显示的数据条目数(即页面大小),然后根据当前页码...

    winform mysql 分页

    本示例中,我们将探讨如何在WinForm应用程序中实现MySQL数据库的分页功能,这在处理大量数据时非常实用,可以提高用户体验并减少系统资源的消耗。 首先,我们需要在Visual Studio 2010中创建一个新的WinForm项目。...

    JSP+MySql分页组件

    【JSP+MySQL分页组件】是Web开发中常见的功能,用于处理大量数据时提高页面加载速度和用户体验。在Web应用程序中,一次性加载所有数据可能导致页面响应慢,尤其是在数据库存储的数据量庞大的情况下。分页技术可以...

    详细讲解MySQL大数据量分页SQL语句优化

    分页程序原理很简单,这里就不多说了,本篇文章主要说的是在数据表记录量比较大的情况下,如何将分页SQL做到更优化,让MySQL执行的更快的方法。

    java连接数据库的分页语句

    Java 连接数据库的分页语句主要包括连接 Oracle、SQL Server 和 MySQL 数据库的语句,以及连接这些数据库的分页语句。 连接 Oracle 数据库的语句: 使用 Oracle 数据库时,需要使用 Oracle 的 JDBC 驱动程序。首先...

    mysql分页查询优化,大数据量优化

    传统的mysql分页查询 select * from table limit n , m MySQL 执行此类SQL时需要先分页(默认一页1000条数据)通过全表扫描到N行,然后再去取M行。对于此类操作,获取前面少数几行数据会很快,但是随着扫描的记录数越...

    PHP MYSQL分页代码

    本资源"PHP MYSQL分页代码"提供了一个实用的解决方案,结合了PHP和MySQL两种技术来实现高效的数据分页功能。 首先,让我们深入了解PHP和MySQL在分页中的角色。PHP是一种广泛使用的服务器端脚本语言,常用于动态网站...

    asp mysql分页(超完美版本)

    ### ASP与MySQL分页技术详解 #### 一、引言 在Web开发中,当数据量庞大时,一次性展示所有数据不仅会导致页面加载缓慢,还会严重影响用户体验。因此,实现数据的分页显示变得尤为重要。本文将详细介绍如何在ASP...

    封装好的php+mysql分页类

    这个"封装好的php+mysql分页类"提供了一种高效且可复用的方法来实现这一目标。以下是对该分页类的详细解析: 1. **类结构**: 分页类通常包含一些关键属性,如每页显示的记录数($limit)、当前页数($currentPage...

    mysql分页实例

    在这个"mysql分页实例"中,我们将深入探讨MySQL的分页查询技术,并提供可以直接引用的分页类。 首先,我们要理解SQL中的基础分页查询语句。在MySQL中,最常用的分页查询方法是结合`LIMIT`和`OFFSET`关键字。`LIMIT`...

    常用的数据库分页语句

    数据库分页是数据库管理系统中一个重要的查询技术,用于在大量数据中实现高效...理解并掌握这些分页语句对于开发高效率、高性能的数据库应用至关重要。在实际应用中,应根据数据库类型和具体需求选择最适合的分页策略。

    java-web-mysql 分页demo

    二、MySQL分页查询 在MySQL中,我们可以使用`LIMIT`和`OFFSET`关键字来实现分页。`LIMIT`用于指定每页显示的数据条数,`OFFSET`用于指定从哪一条记录开始取数据。例如,要获取第2页(每页5条数据)的信息,SQL语句...

Global site tag (gtag.js) - Google Analytics