写点什么

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

  • 2022-12-11
    江西
  • 本文字数:1122 字

    阅读完需:约 4 分钟

​一般分页用的是 limit

当数据量比较大的时候比如 select * from u_user limit 10000000,10

这样查询就会奇慢无比,因为 mysql 会查询前面 一百万+10 条数据之后 再丢弃前面一百万条数据返回最后 10 条数据;

怎么优化呢? 优化方式很多,一般的方式是

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

这样优化没有错,速度也大幅度提高;

1.但是后来发现了这样一个问题,优化后和优化前的数据不一致啊?

后来发现 select id from u_user limit 10000000,1 每次的结果也不一致;

正式因为这个不一致导致了上面优化的查询不一致。为什么会不一致呢?

然后百度,mysql 的默认排序规则;

http://www.cnblogs.com/fnlingnzb-learner/p/6692680.html

今天遇到一个问题,有一个 Select 语句没有加 “Order By”,返回的数据是不确定的。

这种问题碰到不止几次了。追根寻底, Select 语句如果不加 “Order By”, 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;

然后我又发现了一个问题

2.为啥 select id from u_user order by id  limit 10000000,1 返回的顺序不能保证

但是貌似 select * from u_user order by id  limit 10000000,1 每次返回都是一致的呢???

有人告知么?

发布于: 刚刚阅读数: 4
用户头像

关注公众号: 石臻臻的杂货铺 获取最新文章 2019-09-06 加入

进高质量滴滴技术交流群,只交流技术不闲聊 加 szzdzhp001 进群 20w字《Kafka运维与实战宝典》PDF下载请关注公众号:石臻臻的杂货铺

评论

发布
暂无评论
记一次Mysql大数据分页优化问题_MySQL_石臻臻的杂货铺_InfoQ写作社区