在大数据情况下MySQL的一种简单分页优化方法

 更新时间:2015年05月08日 10:13:27   作者:罗龙九  
这篇文章主要介绍了在大数据情况下MySQL的一种简单分页优化方法,分页优化是MySQL优化的常用手段之一,需要的朋友可以参考下

通常应用需要对表中的数据进行翻页,如果数据量很大,往往会带来性能上的问题:

root@sns 07:16:25>select count(*) from reply_0004 where thread_id = 5616385 and deleted = 0;
+———-+
| count(*) |
+———-+
| 1236795 |
+———-+
1 row in set (0.44 sec)
root@sns 07:16:30>select id
from reply_0004 where thread_id = 5616385 and deleted = 0
order by id asc limit 1236785, 10 ;
+———–+
| id    |
+———–+
| 162436798 |
| 162438180 |
| 162440102 |
| 162442044 |
| 162479222 |
| 162479598 |
| 162514705 |
| 162832588 |
| 162863394 |
| 162899685 |
+———–+
10 rows in set (1.32 sec)

索引:threa_id+deleted+id(gmt_Create)
10 rows in set (1.32 sec)
这两条sql是为查询最后一页的翻页sql查询用的。由于一次翻页往往只需要查询较小的数据,如10条,但需要向后扫描大量的数据,也就是越往后的翻页查询,扫描的数据量会越多,查询的速度也就越来越慢。
由于查询的数据量大小是固定的,如果查询速度不受翻页的页数影响,或者影响最低,那么这样是最佳的效果了(查询最后最几页的速度和开始几页的速度一致)。
在翻页的时候,往往需要对其中的某个字段做排序(这个字段在索引中),升序排序。那么可不可以利用索引的有序性来解决上面遇到的问题喃,答案是肯定的。比如有10000条数据需要做分页,那么前5000条做asc排序,后5000条desc排序,在limit startnum,pagesize参数中作出相应的调整。
但是这无疑给应用程序带来复杂,这条sql是用于论坛回复帖子的sql,往往用户在看帖子的时候,一般都是查看前几页和最后几页,那么在翻页的时候最后几页的翻页查询采用desc的方式来实现翻页,这样就可以较好的提高性能:

root@snsgroup 07:16:49>select * from (select id

->      from group_thread_reply_0004 where thread_id = 5616385 and deleted = 0

->    order by id desc limit 0, 10)t order by t.id asc;

+———–+

| id    |

+———–+

| 162436798 |

| 162438180 |

| 162440102 |

| 162442044 |

| 162479222 |

| 162479598 |

| 162514705 |

| 162832588 |

| 162863394 |

| 162899685 |

+———–+

10 rows in set (0.87 sec)

可以看到性能提升了50%以上。

相关文章

  • MYSQL 数据库命名与设计规范

    MYSQL 数据库命名与设计规范

    对于MYSQL 数据库的命名与设计,需要一定的规范,所以我们要了解和快速的掌握mysql有很多的帮助。
    2008-12-12
  • linux二进制通用包安装mysql5.6.20教程

    linux二进制通用包安装mysql5.6.20教程

    这篇文章主要为大家详细介绍了linux二进制通用包安装mysql5.6.20的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 为什么MySQL分页用limit会越来越慢

    为什么MySQL分页用limit会越来越慢

    在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器
    2021-07-07
  • MySQL悲观锁与乐观锁的实现方案

    MySQL悲观锁与乐观锁的实现方案

    我们知道Mysql并发事务会引起更新丢失问题,解决办法是锁,所以本文将对锁(乐观锁、悲观锁)进行分析,这篇文章主要给大家介绍了关于MySQL悲观锁与乐观锁方案的相关资料,需要的朋友可以参考下
    2021-11-11
  • Mysql中的嵌套子查询问题

    Mysql中的嵌套子查询问题

    这篇文章主要介绍了Mysql嵌套子查询,子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,为了让读者更加清楚子查询的概念,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • MySQL 存储过程中执行动态SQL语句的方法

    MySQL 存储过程中执行动态SQL语句的方法

    这篇文章主要介绍了MySQL 存储过程中执行动态SQL语句的方法,需要的朋友可以参考下
    2014-08-08
  • mysql使用教程之分区表的使用方法(删除分区表)

    mysql使用教程之分区表的使用方法(删除分区表)

    mysql分区表使用方法,新增分区、删除分区、分区的合并、分区的拆分等使用方法
    2013-12-12
  • MySQL 驱动中虚引用 GC 耗时优化与源码分析

    MySQL 驱动中虚引用 GC 耗时优化与源码分析

    这篇文章主要为大家介绍了MySQL 驱动中虚引用 GC 耗时优化与源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • CentOS7 64位下MySQL5.7安装与配置教程

    CentOS7 64位下MySQL5.7安装与配置教程

    这篇文章主要介绍了CentOS7 64位下MySQL5.7安装与配置教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Mysql性能优化之索引下推

    Mysql性能优化之索引下推

    这篇文章主要介绍了Mysql性能优化之索引下推,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论