本文作者:kris

MySQL实现分页查询的方法-mysql实现分页查询的方法有哪些

kris 2025-01-19 01:48:04 3
MySQL实现分页查询的方法-mysql实现分页查询的方法有哪些摘要: mysql分页查询为什么会丢失数据?在MySQL中进行分页查询时,如果不正确地设置分页参数,可能导致数据丢失。以下是一些常见的原因:1. 错误的查询逻辑:在编写分页查询语句时,如果...

mysql分页查询为什么会丢失数据?

在MySQL中进行分页查询时,如果不正确地设置分页参数,可能导致数据丢失。以下是一些常见的原因:

1. 错误的查询逻辑:在编写分页查询语句时,如果逻辑错误可能导致查询结果的偏移量不正确,进而导致数据丢失。例如,设置了错误的起始行数或限制行数。

2. 唯一性约束:如果使用分页查询时涉及到唯一性约束的列(如主键),并且在不同页之间有新增或删除操作,可能会导致数据丢失。例如,当一页的新增或删除操作影响到另一页的数据时,可能会导致部分数据被跳过或重复显示。

3. 并发操作:在高并发环境下,如果有其他的并发操作同时修改查询结果的数据,可能会导致数据丢失。例如,当进行分页查询时,如果有其他并发的更新或删除操作在查询过程中进行,可能会导致部分数据无法显示或不一致。

为了避免分页查询导致的数据丢失问题,可以考虑以下几点:

1. 确保正确的查询逻辑:仔细编写分页查询语句,确保设置正确的起始行数和限制行数,以及正确的排序条件。

2. 使用稳定的排序列:在分页查询中,使用稳定的排序列,例如有唯一性保证的列,以避免数据丢失。这可以使用具有稳定排序特性的列作为排序条件,例如使用主键进行排序。

3. 使用锁和事务:在并发环境下,使用合适的锁和事务控制来保证查询的一致性。这可以确保在查询过程中不会发生并发的数据修改操作。

4. 使用合适的分页库或框架:如果使用较复杂的查询需求,考虑使用成熟的分页库或框架,它们通常会提供更完善和高效的分页查询功能,避免数据丢失问题。

需要根据具体的应用场景和查询需求来评估和选择适当的解决方案,以避免分页查询导致的数据丢失问题。

为什么MySQL在数据库较大的时候分页查询很慢,如何优化?

题主给的这个sql其实想要的数据也就20条吧(你那个300020应该是打错了,不可能是实际业务一页显示30多万条记录),单纯查三十多万数据其实很快,为什么分页后就很慢?

变慢的原因,一方面是select *,另一方面是数据量较大,还有一个是带有排序操作。本质是分页查询时,会先查询出limit + offset条记录,然后截取后面的offset记录。

MySQL实现分页查询的方法-mysql实现分页查询的方法有哪些

Mysql数据库作为一款比较主流的开源关系型数据库,市场上我觉得貌似开发者没有一个没用过吧。

影响MySQL查询性能的因素有很多,比如sql,表结构设计,磁盘io,网卡io,高并发,数据库相关参数配置,还有服务器硬等。

这里面涉及最多也是面试中最常问的就是有关sql的优化。

因为很多性能上的问题来自sql的比较多,mysql数据库在数据量级达到百万以上性能是逐渐下降的。

关于sql优化又有很多优化的方向和手段。比如对表结构的字段类型,默认值,索引等最基础的做一些优化,然后编写的sql最好要能完全命中索引。

当然并不是说建索引就一定命中,不走索引就一定慢。这取决于mysql的执行计划。

还有建索引也并不是越多越好,单表索引最好不要超过6个,毕竟索引也占空间,数据更新的同时,还牵扯到索引文件的维护。

OK说了这么多,到底该怎么对这个分页又排序做优化呢?

我的做法就是合理利用主键索引来处理

select a.* from table a inner join (select id from table

limit 300000,20)

b on a.id=b.id;

然后排序最好放到代码层面上去。

希望我的回答能帮到你

问题

我们有一个 SQL,用于找到没有主键 / 唯一键的表,但是在 MySQL 5.7 上运行特别慢,怎么办?

实验

我们搭建一个 MySQL 5.7 的环境,此处省略搭建步骤。

写个简单的脚本,制造一批带主键和不带主键的表:

MySQL实现分页查询的方法-mysql实现分页查询的方法有哪些

执行一下脚本:

MySQL实现分页查询的方法-mysql实现分页查询的方法有哪些

现在执行以下 SQL 看看效果:

MySQL实现分页查询的方法-mysql实现分页查询的方法有哪些

...

执行了 16.80s,感觉是非常慢了。

现在用一下 DBA 三板斧,看看执行计划:

感觉有点惨,由于 information_schema.columns 是元数据表,没有必要的统计信息。

那我们来 show warnings 看看 MySQL 改写后的 SQL:

MySQL实现分页查询的方法-mysql实现分页查询的方法有哪些

我们格式化一下 SQL:

可以看到 MySQL 将

select from A where A.x not in (select x from B) //非关联子查询

转换成了

select from A where not exists (select 1 from B where B.x = a.x) //关联子查询

如果我们自己是 MySQL,在执行非关联子查询时,可以使用很简单的策略:

select from A where A.x not in (select x from B where ...) //非关联子查询:1. 扫描 B 表中的所有记录,找到满足条件的记录,存放在临时表 C 中,建好索引2. 扫描 A 表中的记录,与临时表 C 中的记录进行比对,直接在索引里比对,

而关联子查询就需要循环迭代:

select from A where not exists (select 1 from B where B.x = a.x and ...) //关联子查询扫描 A 表的每一条记录 rA: 扫描 B 表,找到其中的第一条满足 rA 条件的记录。

显然,关联子查询的扫描成本会高于非关联子查询。

我们希望 MySQL 能先"缓存"子查询的结果(缓存这一步叫物化,MATERIALIZATION),但MySQL 认为不缓存更快,我们就需要给予 MySQL 一定指导。

...

MySQL实现分页查询的方法-mysql实现分页查询的方法有哪些

可以看到执行时间变成了 0.67s。

整理

我们诊断的关键点如下:

\1. 对于 information_schema 中的元数据表,执行计划不能提供有效信息。

\2. 通过查看 MySQL 改写后的 SQL,我们猜测了优化器发生了误判。

\3. 我们增加了 hint,指导 MySQL 正确进行优化判断。

但目前我们的实验仅限于猜测,猜中了万事大吉,猜不中就无法做出好的诊断。

这个得明白mysql的存储原理 讲个例子 一个小区有很多栋 一栋有很多层 一层有很多室 你哪个小区哪一栋那一层都不告诉它 它能一下找到吗 虽然它也想快点帮你找到

文章版权及转载声明

作者:kris本文地址:https://www.damoyx.com/p/24766.html发布于 2025-01-19 01:48:04
文章转载或复制请以超链接形式并注明出处大漠游侠网

阅读
分享