mysql limit分页查询效率比拼
1、直接使用数据库提供的SQL语句 limit M ,N
SELECT * from message limit 0 , 10 ; -- 0.044 SELECT * from message limit 100 , 10 ; -- 0.084 SELECT * from message limit 1000 , 10 ; -- 0.087 SELECT * from message limit 10000 , 10 ; -- 0.102 SELECT * from message limit 100000 , 10 ; -- 0.236 SELECT * from message limit 1000000 , 10 ; -- 1.584 SELECT * from message limit 2000000 , 10 ; -- 2.961
适用场景:可以看出,在数据量小时,使用limit M ,N 可以很快的查询出数据,但是当数据量达到十万级甚至百万级时,查询效率呈几何倍数递增;
分析: 如下,其原因是,该查询会导致全表扫描,速度会很慢,且有的数据库返回结果集不稳定(如某次返回1,2,3,另外一次返回2,1,3),limit限制的是从结果集的M位置取出N条输出,其余抛弃;
2、基于索引排序
SELECT * from message order by id asc limit 0 , 10 ; -- 0.085 SELECT * from message order by id asc limit 100 , 10 ; -- 0.084 SELECT * from message order by id asc limit 1000 , 10 ; -- 0.088 SELECT * from message order by id asc limit 10000 , 10 ; -- 0.099 SELECT * from message order by id asc limit 100000 , 10 ; -- 0.227 SELECT * from message order by id asc limit 1000000 , 10 ; -- 1.532
适用场景:数据量小时,当数据量达到十万到百万级时,查询效率与第一种相比,仍呈现几何倍数递增
分析:在数据量小时,会根据索引进行选择,但是数据量大时,仍旧会导致全表扫描
3、基于所以筛选再排序
SELECT * from message order by id asc limit 10 ; -- 0.043 SELECT * from message where id > 100 order by id asc limit 10 ; -- 0.085 SELECT * from message where id > 1000 order by id asc limit 10 ; -- 0.085 SELECT * from message where id > 10000 order by id asc limit 10 ; -- 0.084 SELECT * from message where id > 100000 order by id asc limit 10 ; -- 0.085 SELECT * from message where id > 1000000 order by id asc limit 10 ; -- 0.083 SELECT * from message where id > 2000000 order by id asc limit 10 ; -- 0.085 SELECT * from message where id > 2000000 order by id desc limit 10 ; -- 0.085
总结:可以看出,该查询效率稳定,适用于数据量多是情况,最后ORDER BY后的列对象是主键或者唯一索引,使得ORDER BY操作能利用索引被消除,但是结果集是稳定的
分析:索引扫描,速度会很快;
mysql limit分页查询效率比拼的更多相关文章
- mysql limit分页查询效率
对于有大数据量的mysql表来说,使用LIMIT分页存在很严重的性能问题. 查询从第1000000之后的30条记录: SQL代码1:平均用时6.6秒 SELECT * FROM `cdb_posts` ...
- 在MySQL中如何使用覆盖索引优化limit分页查询
背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...
- Mysql中分页查询两个方法比较
mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1; SELECT a FROM ...
- oracle 的分页查询与mysql 的分页查询
oracle 的分页查询: select * from (select o.*,rownum rn from Persons o) where rn >40 and rn <=60 : ...
- MySQL Limit 限定查询记录数
MySQL Limit 限定查询记录数 MySQL LIMIT MySQL 中 LIMIT 关键字用于限定查询记录返回最大数目. 语法: ... LIMIT offset , rows 该语法中,of ...
- Oracle和MySql的分页查询区别和PL/SQL的基本概念
Oracle和MySql的分页查询区别: Oracle的分析查询,之前Oracle的分页是使用伪列 ROWNUM 结合子查询实现,mysql的分页更简单,直接使用 LIMIT 关键字就可以实现 ...
- mysql in 子查询 效率慢 优化(转)
mysql in 子查询 效率慢 优化(转) 现在的CMS系统.博客系统.BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下.但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久! ...
- Mybatis的ResultMap与limit分页查询
ResultMap主要解决的是:属性名和字段不一致 如果在pojo中设置的是一个名字,在数据库上又是另一个名字,那么查询出来的结果或者其他操作的结果就为null. //在pojo中 private S ...
- mysql limit分页查询优化写法
在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用orderby排 序.但是在表数据量比较大的时候,例如查询语句片段limit 10000, 20,数据库会读取10020条 ...
随机推荐
- 从零开始一起学习SALM-ICP原理及应用
点"计算机视觉life"关注,星标更快接收干货! ## 小白:师兄,最近忙什么呢,都见不到你人影,我们的课也好久没更新了呢 师兄:抱歉,抱歉,最近忙于俗事.我后面一起补上,学习劲头 ...
- java虚拟机-GC-新生代的GC、老年代的GC
名词解释: GC:垃圾收集器 Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非 ...
- 关于自己"手机瘾"的切身体验
其实之前也喜欢看手机,只是从去年7月份开始,因为自控能力.新项目等原因,导致"手机瘾"这个病更严重了,控制不住,一看就是几小时.去年过年的时候,自己定的第一个目标就是戒掉手机瘾,到 ...
- 【Mysql】索引简介
本文口味:番茄炒蛋,预计阅读:10分钟. 博客又停更了两个月,在这期间,对人生和世界多了许多思考.在人生的不同阶段,会对生活和世界有着不一样的认知,而认知的改变也会直接反应在行为模式之中. 对于生活的 ...
- JS格式化JSON后的日期
序列化后日期变成了 /Date(1494524134000+0800)\ 这种格式 不能正常显示了 但也不能为了这个吧所有服务的DateTime字段都改成String类型 于是找了一个JS的扩展方法来 ...
- 【linux杂谈】在SSH连接中,openssh如何解决'Connection refused'错误?
openssh是SSH (Secure SHell) 协议的免费开源实现.SSH协议族可以用来进行远程控制, 或在计算机之间传送文件. 这就意味着远程登陆,文件推拉特别是搭建集群后公钥的部署,经常要利 ...
- Elasticsearch(三) 插件安装
1.head插件 命令: ./bin/plugin install mobz/elasticsearch-head
- 在rman恢复中incarnation的概念
摘要 本文主要介绍incarnation的由来,在rman恢复中的作用,以及相关rman恢复的注意事项. 概念说明 从10g开始,incarnation被引入,用于跨越resetlogs进行恢复,由此 ...
- JavaScript剩余操作符Rest Operator
本文适合JavaScript初学者阅读 剩余操作符 之前这篇文章JavaScript展开操作符(Spread operator)介绍讲解过展开操作符.剩余操作符和展开操作符的表示方式一样,都是三个点 ...
- Oracle将两张表的数据插入第三张表且第三张表中不存在
1.由于是先查再插所以不能使用insert into table1() values(), 要使用insert into table1() select * table2,不能使用values. 2. ...