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.如果分页排序字 ...
随机推荐
- Android Studio 使用 Gradle 打包 Jar
Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤: 1.将 plugin 修改为 library 后 build 出 aar ...
- Spark-SQL连接MySql关系型数据库
本文主要分析Spark SQL官方文档中有关于JDBC To Other Databases部分,以MySQL数据库为例,结合数据读写操作的实例代码进行详细的分析.本文中的代码需要使用到Mysql J ...
- jdbc连接sql数据库
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- 敦泰FT6X06单层自容调屏
总的概括来说,自电容调屏在配置好通道个数和顺序后,只需调整AFE相关的设置参数使各通道的Raw Data和CI值符合定义的标准即可.– AFE是模拟前端的缩写-Analog Front End• Ra ...
- (六十一)Xcode的git版本控制
打开终端 1.为项目添加git: 首先到达项目的根目录内部,输入git init,初始化一个空的代码仓库(隐藏文件.get). 接下来使用git add . --all .表达把当前目录及子目录中的文 ...
- (三十六)利用AFNetworking进行JSON数据解析
1.首先要安装CocoaPods,然后在需要AFNetworking的工程根目录建立podfile,内容如下: platform :ios, '7.0' pod 'AFNetworking' 2.然后 ...
- python的join(string)函数
join是字符串操作函数,操作的也是字符串. key="\t".join(('a','b','c')) result= key.split("\t") prin ...
- 【翻译】在Sencha Touch中创建离线/在线代理
原文:Creating an Online/Offline proxy in Sencha Touch 概述 在Sencha Touch中,一个常见的需求就是,当设备在没有连接互联网的时候,应用程序必 ...
- (二十四)监听键盘的通知和键盘弹出隐藏的View移动
让控制器监听键盘的通知,注意谁监听,谁的dealloc方法中就要remove,如果非ARC还要调用父类的dealloc方法. //监听键盘的操作: [[NSNotificationCenter def ...
- session效率
(1)-不恰当的request.getSession() 在HttpServlet中,HttpSession对象通常在request.getSession(true)方法调用时才创建. HttpSes ...