Mysql分页查询性能分析
前言
【PS:原文手打,转载说明出处,博客园】
看过一堆的百度,最终还是自己做了一次实验,本文基于Mysql5.7.17版本,Mysql引擎为InnoDB,编码为utf8,排序规则为utf8_general_ci
网络搜索查询语句
Sql分页查询基于LIMIT,如下:
select * from SysTestUser order by Id LIMIT ;
select * from SysTestUser order by Id LIMIT ,;
网络上各说风云,有下面几种写法说速度快
1:如下子查询
select * from SysTestUser where Id in( select Id from (select Id from SysTestUser order by Id LIMIT ,) t );
2:如下图
select Id from SysTestUser order by Id LIMIT ,;
select * from SysTestUser where id in(,,,,,,,,,) order by Id ;
3:如下
select * from SysTestUser where id>=(select id from SysTestUser order by id limit ,) limit ;
实践出真知
我们新建一张表(PS:不要在意每个字段类型,这张表只是测试使用。)
-- ----------------------------
-- Table structure for SysTestUser
-- ----------------------------
DROP TABLE IF EXISTS `SysTestUser`;
CREATE TABLE `SysTestUser` (
`Id` int() NOT NULL AUTO_INCREMENT COMMENT 'Id',
`UserName` varchar() NOT NULL COMMENT '姓名',
`Sex` tinyint() NOT NULL COMMENT '性别',
`Height` decimal(,) NOT NULL COMMENT '身高',
`Age` smallint() NOT NULL COMMENT '年龄',
`Brithday` datetime NOT NULL COMMENT '生日',
`CreationTime` datetime NOT NULL COMMENT '创建时间',
`LastModificationTime` datetime NOT NULL COMMENT '修改时间',
`IsDeleted` bit() NOT NULL COMMENT '是否软删除',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 COMMENT='测试用户表';
然后模拟了5038960条数据进库,分别进行查询,如下结果
无条件查询
select * from SysTestUser order by Id LIMIT ,;
80万=0.325
140万=0.579
500万=2.0 select * from SysTestUser where Id in( select Id from
(select Id from SysTestUser order by Id LIMIT ,) t );
80万=0.65
140万=1.179
500万=4.0 select Id from SysTestUser order by Id LIMIT ,;
select * from SysTestUser where id in(,,,,,,,,,) order by Id ;
80万=0.225
14万=0.39
500万=.368s select * from SysTestUser where id>=(select id from SysTestUser order by id limit ,) limit ;
80万=0.225
140万=0.397
500万=1.363
有条件查询(PS,字段没添加任何索引,由于批量新增,UserName=string+Id来着)
select * from SysTestUser where UserName like 'string%' and age= order by Id LIMIT ,;
80万=0.4
140万=0.71
500万=2.5 select * from SysTestUser where Id in( select Id from
(select Id from SysTestUser where UserName like 'string%' and age= order by Id LIMIT ,) t );
80万=0.33
140万=0.59
500万=2.06 select Id from SysTestUser where UserName like 'string%' and age= order by Id LIMIT ,;
select * from SysTestUser where id in(,,,,,,,,,) order by Id ;
80万=0.33
140万=0.59
500万=2.07 select * from SysTestUser where id>=(select id from SysTestUser where UserName like 'string%' and age= order by id limit ,) limit ;
80万=0.33
140万=0.59
500万=2.046
测试结论
百万级数据分页的情况下,以上方式都能够忍受,当数据量达到五百万的时候,需要的查询时间直接让人无法忍受了
处理方式
百万级以内的分页,无所谓写法,随便写没啥区别,百万级以上的,又需要查询分页查询的,可以使用以下方式。
select * from SysTestUser where ID> limit
select * from SysTestUser where ID> and UserName like 'string%' limit
至于ID哪里拿,怎么拿我给的建议是,第一页分页不管以何种方式写都很快,此时数据显示到前端,当点击下一页时,带上maxId or minID,这个看排序情况
这个时候的上面的ID是大于还是小于也看排序情况,我就不一一的写出来了。
结尾
大表分页是一件很头疼的事情,在实际业务场景能避免尽量避免,如果避免不了的情况下,尽量借助扩展表,缓存的形式来处理
例如:查询总条数,这个是避免不了的消耗的情况,完全可以写个计数器
在例如查询用户订单列表,完全可以使用Redis缓存用户订单信息等
不要用小刀来杀牛,杀不动
Mysql分页查询性能分析的更多相关文章
- MySQL分页查询性能优化
		
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的一些方 ...
 - mysql、sql server、oracle数据库分页查询及分析(操作手册)
		
1.mysql分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实 ...
 - MySQL 慢查询日志分析及可视化结果
		
MySQL 慢查询日志分析及可视化结果 MySQL 慢查询日志分析 pt-query-digest分析慢查询日志 pt-query-digest --report slow.log 报告最近半个小时的 ...
 - SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较
		
SQL查询性能分析之(not in).(and not).().(!=)性能比较 SQL Server Bruce 3年前 (2013-01-08) 3284浏览 0评论 <:article c ...
 - MySQL分页查询的性能优化
		
MySQL limit分页查询的性能优化 Mysql的分页查询十分简单,但是当数据量大的时候一般的分页就吃不消了. 传统分页查询:SELECT c1,c2,cn… FROM table LIMIT n ...
 - MySQL分页查询大数据量优化方法
		
方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因/缺点: ...
 - mysql分页查询语法
		
一.limit语法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指 ...
 - MySQL之查询性能优化(四)
		
优化特定类型的查询 COUNT()的作用 COUNT()是一个特殊函数,有两个非常不同的作用:它可以统计某个列值的数量,也可以统计行数.在统计列值时要求列值是非空的(不统计NULL). 如果在COUN ...
 - 使用聚集索引和非聚集索引对MySQL分页查询的优化
		
内容摘录来源:MSSQL123 ,lujun9972.github.io/blog/2018/03/13/如何编写bash-completion-script/ 一.先公布下结论: 1.如果分页排序字 ...
 
随机推荐
- Eclipse中查看没有源码的Class文件的方法
			
本文地址:http://blog.csdn.net/sushengmiyan/article/details/18798473 本文作者:sushengmiyan 我们在使用Eclipse的时候,经常 ...
 - CentOS配置
			
1.在Vmware中安装好虚拟机. 2.客户机(即虚拟机中的centos)网络连接使用仅主机模式Host-only 3.在主机中网络配置上,配置IP地址 1.使用PieTTY远程连接该虚拟机 2.使用 ...
 - JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
			
JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...
 - 12、Libgdx的图像之全屏和垂直同步
			
(官网:www.libgdx.cn) 检测当前设置 判断是否设置全屏,可以通过如下方式: boolean fullscreen = Gdx.graphics.isFullscreen(); 设置全屏和 ...
 - VC++读取图像RGB值
			
代码: #include <iostream> #include <fstream> #include <string> #include <windows. ...
 - spring与mybatis(oracle)整合
			
今天闲着无聊把项目拆解开,抽出了spring与mybatis部分.做了个demo,希望对初学者有些帮助,另外整个demo是从项目中完整剥离下来的,里面的架构大家也可以参考一下. 先是完整的项目图 首先 ...
 - JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展
			
JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...
 - Leetcode_172_Factorial Trailing Zeroes
			
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42417535 Given an integer n, re ...
 - 《java入门第一季》之Integer类和自动拆装箱概述
			
/ * int 仅仅是一个基本类型.int有对应的类类型,那就是Integer. * 为了对基本数据类型进行更多的操作,更方便的操作,Java就针对每一种基本数据类型提供了对应的类类型--包装类类型 ...
 - 《java入门第一季》之面向对象匿名内部类面试题
			
面试题一: /* 按照要求,补齐代码 interface Inter { void show(); } class Outer { // ...