记一次Mysql大数据分页优化问题

在网上搜了一下,在MySQL论坛发现了这篇文章。

http://forums.mysql.com/read.PHP?21,239471,239688#msg-239688

简单翻译一下

  • 不能依赖 MySQL 的默认排序

  • 如果你想排序,总是加上 Order By

  • GROUP BY 强加了 Order By (这与标准语法冲突,如果要避免,请使用 ORDER BY NULL)这里我有疑问,

到底强加了何种 Order by

对于 MyISAM 表

MySQL Select 默认排序是按照物理存储顺序显示的。(不进行额外排序).

也就是说

SELECT * FROM tbl – 会产生“表扫描”。如果表没有删除、替换、更新操作,记录会显示为插入的顺序。

InnoDB 表

同样的情况,会按主键的顺序排列。再次强调,这只是潜规则(artifact of the underlying implementation:怎么翻译?),

不靠谱的。

我的理解与推测:

“Select” 不加 “Order by”时, MySQL 会尝试以尽可能快的方法(MySQL 实际的方法不见得快)返回数据。

由于访问主键、索引大多数情况会快一些(在Cache里)所以返回的数据有可能以主键、索引的顺序输出,

这里并不会真的进行排序,主要是由于主键、索引本身就是排序放到内存的,所以连续输出时可能是某种序列。

在一些情况下消耗硬盘寻道时间最短的数据会先返回。

如果只查询单个表,在特殊的情况下是有规律的。

最后总结

“Order By 是要加的”

如果谁想更深一步了解,需要看看 MySQL 的源代码了。

如上,是关键,因为mysql默认排序的不确定性,所以每次返回的都不一样

解决办法:加上order by

select * from u_user where id >= (select id from u_user order by id  limit 10000000,1) limit 10;

然后我又发现了一个问题

总结

就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

三面蚂蚁核心金融部,Java开发岗(缓存+一致性哈希+分布式)

。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。**

[外链图片转存中…(img-DM4Trzte-1714798740761)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值