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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 记一次Mysql大数据分页优化问题

一般分页用的是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 每次返回都是一致的呢???

有人告知么?

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
131 9
|
6天前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
35 16
|
7天前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
24 7
|
1月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
74 18
|
30天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
49 7
|
29天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
80 5
|
2月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
66 2
|
2月前
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
518 7
|
2月前
|
存储 分布式计算 大数据
大数据 优化数据读取
【11月更文挑战第4天】
65 2
|
9天前
|
分布式计算 Shell MaxCompute
odps测试表及大量数据构建测试
odps测试表及大量数据构建测试