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.如果分页排序字 ...
随机推荐
- Java Web 高性能开发,第 3 部分: 网站优化实战
这个系列的前两篇,介绍了前端的优化技术,这些技术秉承了前人至高无上的智慧,我只是负责吸收和传播.然而,这些技术一般也都是某某大型网站的技术经验,我们大部分人或许只能接触到相对小规模的网站,小规模的网站 ...
- python is not None
python 判空常用 XX is not None,但其实 not XX is None 也可以. http://stackoverflow.com/questions/2710940/pyth ...
- 深入 JAVA里面关于byte数组和String之间的转换问题
把byte转化成string,必须经过编码. 例如下面一个例子: importjava.io.UnsupportedEncodingException; publicclass test{ pub ...
- (NO.00001)iOS游戏SpeedBoy Lite成形记(二十一)
现在游戏中如果钱用光了赌场也是不管的,所以我们要加上Game Over的逻辑. 出现游戏结束条件很简单,就是GameState的totalMoney <= 0.而在游戏结束时我们要做些什么呢?有 ...
- 【一天一道LeetCode】#42. Trapping Rain Water
一天一道LeetCode系列 (一)题目 Given n non-negative integers representing an elevation map where the width of ...
- Cocos2D遍历场景图(Scene Graph)
另一个Cocos2D有用的调试特性是打印出递归的打印出节点的孩子们. 你可以添加以下一行到MainScene或GameScene的didLoadFromCCB的方法中: [self.scene wal ...
- STL算法设计理念 - 谓词,一元谓词demo
谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个,函数返回值是bool类型,可以作为一个判断式 谓词可以使一个仿函数,也可以是一个回调函数. demo 一元谓 ...
- Spring AOP (二)
下面介绍@AspectJ语法基础 一.切点表达式函数 AspectJ的切点表达式由关键字和操作参数组成,如execution(* greetTo(..)) 的切点表达式,execution为关键字,而 ...
- Spring 官网jar下载
1,首先输入http://spring.io/进入Spring官网 2,点击project 栏,找到Spring framwork 3,点击reference 4,找到Distribution Zip ...
- CRF资料
与最大熵模型相似,条件随机场(Conditional random fields,CRFs)是一种机器学习模型,在自然语言处理的许多领域(如词性标注.中文分词.命名实体识别等)都有比较好的应用效果.条 ...