一般我们数据量大的时候,然后就需要进行分页,一般分页语句就是limit offset,rows。这种分页数据量小的时候是没啥影响的,一旦数据量越来越大随着offset的变大,性能就会越来越差。下面我们就来实验下:

准备数据

建一个测试表引擎为MyISAM(插入数据没有事务提交,插入速度快)的表。

CREATE TABLE USER (id INT ( 20 ) NOT NULL auto_increment,NAME VARCHAR ( 20 ) NOT NULL,address VARCHAR ( 20 ) NOT NULL,PRIMARY KEY ( id )) ENGINE = MyISAM;

写一个批量插入的存储过程

delimiter //# 删除表数据TRUNCATE TABLE t;# 如果已经有sp_test_batch存储过程,将其删除,后面重新创建DROP PROCEDURE IF EXISTS sp_test_batch;# 创建存储过程,包含num和batch输入,num表示插入的总行数,batch表示每次插入的行数CREATE PROCEDURE sp_test_batch(IN num INT,IN batch INT)BEGINSET @insert_value = '';# 已经插入的记录总行数SET @count = 0;#SET @batch_count = 0;WHILE @count < num DO# 内while循环用于拼接INSERT INTO t VALUES (),(),(),...语句中VALUES后面部分WHILE (@batch_count < batch AND @count < num) DOIF @batch_count>0THENSET @insert_value = concat(@insert_value,',');END IF;SET @insert_value = concat(@insert_value,"('name", @count, "','address", @count, "')");SET @batch_count = @batch_count+1;END WHILE;SET @count = @count + @batch_count;# 拼接SQL语句并执行SET @exesql = concat("insert into user(name,address) values ", @insert_value);PREPARE stmt FROM @exesql;EXECUTE stmt;DEALLOCATE PREPARE stmt;# 重置变量值SET @insert_value = '';SET @batch_count=0;END WHILE;# 数据插入完成后,查看表中总记录数SELECT COUNT(id) FROM user;ENDCALL sp_test_batch(10000000,10000);

插入1000w数据

测试性能    下面我们分别针对于offset等于不同的值来进行实:offset等于10000时耗时

offset等于100000时耗时

offset等于1000000时耗时

offset等于5000000时耗时

offset等于10000000时耗时

从上图可以得出随着offset的值越大耗时就越来越多。这还只是1000w数据,如果我们上亿数据呢,可想而知这时候查询的效率有多差。下面我们来进行优化。

4 .进行优化

子查询的分页方式:

SELECT * FROM user WHERE id >=(SELECT id FROM user ORDER BY id LIMIT 9000000, 1) LIMIT 10

从图可以得出子查询确实速度快了一倍。

JOIN分页方式:

SELECT * FROM user t1 INNER join

(SELECT id FROM user ORDER BY id LIMIT 9000000, 10) t2 on t2.id =t1.id

join的方式比子查询性能在稍微好点。

终极优化:

这个时间性能是最好的。这种优化必须要依赖前一次的查询的最大ID,如果是那种分页直接可以指定多少页的是不行的,必须是只能后一页,后一页这么点击。

SELECT id FROM user where id > 9000000 ORDER BY id LIMIT 10;

mysql大量数据分页优化_mysql大量数据分页优化相关推荐

  1. mysql 大分页查询优化_Mysql骚操作:优化大分页查询

    背景 系统结构如上图.经过排查是因为系统B拉取数据时间太长导致的推送超时. 系统B拉取数据的方法是根据_tiemstamp(数据操作时间)分页查询系统A的接口,即: 1SELECT 字段名2FROM  ...

  2. 向 mysql导入数据 源码_MySQL 导入数据

    MySQL 导入数据 MySQL中可以使用两种简单的方式来导入MySQL导出的数据. 使用 LOAD DATA 导入数据 MySQL 中提供了LOAD DATA INFILE语句来插入数据. 以下实例 ...

  3. linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...

    背景 问题介绍 现在有一个linux系统的机器上数据需要移植到另外一个linux系统上.老机器称A机器,新机器称B机器. 前期调研 鉴于网上资料很多都是相同内容,而数据库的数据一般都很重要,这些方法都 ...

  4. mysql冷区域热区域_mysql的数据备份方式,及热备与冷备的优缺点对比

    一.按照数据库的运行状态分类: (1)热备:在数据库运行时,直接进行备份,对运行的数据库没有影响 (2)冷备:在数据库停止运行的时候进行备份,这种备份方式最为简单,只需要拷贝数据库物理文件即可. (3 ...

  5. mysql删减表的关键字_Mysql 删除数据及数据表

    在Mysql 中删除数据以及数据表非常的容易,但是需要特别小心,因为一旦删除所有数据都会消失. 删除数据 删除表内数据,使用delete关键字. 删除指定条件的数据 删除用户表内id 为1 的用户:d ...

  6. mysql 插入前查重_Mysql插入数据前查重

    常见插入数据的SQL insert into 插入数据库时会检查主键是否存在,存在会报错 replace into 替换数据库记录,需要表中有主键或者unique索引,如果数据库已存在的数据,会先删除 ...

  7. mysql和mybatis优化_MySQL + mybatis的SQL优化方案

    sql优化方案: 1.添加索引,在条件参数,关联参数上建立参数, 2.字段优化,需要什么字段查什么字段 3.模糊查询尽量使用: select * from tableName a where a.na ...

  8. mysql sql优化_MySQL数据库SQL语句优化原理专题(三)

    需求 做过开发的同学,对分页肯定不会陌生,因为很多前台页面展示,为了更好的展示数据,就会用到分页,所以如何写一个高性能的分页SQL语句,是每一个开发人员需要掌握的技能. 分页SQL 这里给大家写一个分 ...

  9. mysql部门人员排序设计_MySQL数据库访问性能优化

    MYSQL应该是最流行的WEB后端数据库.大量应用于PHP,Ruby,Python,Java 等Web语言开发项目中,无论NOSQL发展多么快,都不影响大部分架构师选择MYSQL作为数据存储. MYS ...

最新文章

  1. 实现DataGridView中同一列不同行控件类型的不同
  2. 【Python3爬虫】最新的12306爬虫
  3. tf.nn.in_top_k的用法
  4. 算法设计与分析——递归与分治策略——线性时间选择
  5. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。
  6. linux中lvm的缩减
  7. 运算符重载——算术运算符重载
  8. ZABBIX 3.2.7 (源码包)安装部署
  9. 计算机网络第五版思维导图大全集
  10. 概率论与数理统计的学习
  11. 单双面打印价格一样吗_正式合同应该打印单面还是双面?
  12. react在部分安卓手机浏览器无法加载页面或页面空白
  13. codesmith mysql 模板_CodeSmith代码自动生成器 JAVA模版的制作---CodeSmith+MySQL+MyEclipse 10...
  14. 基本共射放大电路的简单进化 阻容式耦合放大电路
  15. 无人车之美——技术要点速览
  16. 安卓手机如何投屏mac苹果电脑上面?
  17. 李开复给大学生的第6封信:选择的智慧
  18. 抖音橱窗和抖音小店有什么区别?四和能聚分析抖音电商两种模式
  19. 基于RTP协议的IP电话QoS监测及提高策略
  20. 年轻代、年老代和持久代

热门文章

  1. 【uni-app】小程序实现微信在线聊天(私聊/群聊)
  2. Spring boot的@Value注解
  3. ospf hello时间和dead_使用OSPF协议使SPOKE端正常通信
  4. Shiro + JWT + Spring Boot Restful 简易教程
  5. 「五大常用算法」一文图解分治算法和思想
  6. Java 效率工具之 Lombok
  7. 数据库设计--数据字典
  8. 制作r710 linux系统盘,记一次云主机系统盘扩容及制作私有镜像的操作步骤
  9. 数据结构于算法—线性表
  10. poj1061-青蛙的约会(拓展欧几里得java)