分享好友 最新动态首页 最新动态分类 切换频道
亿级数据量场景下,如何优化数据库分页查询方法?
2024-11-07 23:18
摘要:刷帖子翻页需要分页查询,搜索商品也需分页查询。当遇到上千万、上亿数据量,怎么快速拉取全量数据呢?

本文分享自华为云社区《大数据量性能优化之分页查询》,作者: JavaEdge。

亿级数据量场景下,如何优化数据库分页查询方法?

刷帖子翻页需要分页查询,搜索商品也需分页查询。当遇到上千万、上亿数据量,怎么快速拉取全量数据呢?比如:

  • 大商家拉取每月千万级别的订单数量到自己独立的ISV做财务统计
  • 拥有百万千万粉丝的大v,给全部粉丝推送消息

常见错误写法

典型的排序+分页查询:

MySQL 执行此类SQL时:先扫描到N行,再取 M行。N越大,MySQL需扫描更多数据定位到具体的N行,这会耗费大量的I/O成本和时间成本。为什么上面的SQL写法扫描数据会慢?

  • t是个索引组织表,key idx_kid_type(kid,type)

符合kid=3 and type=1 的记录有很多行,我们取第 9,10行。

对于Innodb,根据 idx_kid_type 二级索引里面包含的主键去查找对应行。

对百万千万级记录,索引大小可能和数据大小相差无几,cache在内存中的索引数量有限,而且二级索引和数据叶子节点不在同一物理块存储,二级索引与主键的相对无序映射关系,也会带来大量随机I/O请求,N越大越需遍历大量索引页和数据叶,需要耗费的时间就越久。

由于上面大分页查询耗时长,是否真的有必要完全遍历“无效数据”?

若需要:

跳过前面8行无关数据页的遍历,可直接通过索引定位到第9、10行,这样是不是更快?

这就是延迟关联的核心思想:通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据,而非通过二级索引获取主键再通过主键遍历数据页。

通过如上分析可得,通过常规方式进行大分页查询慢的原因,也知道了提高大分页查询的具体方法。

简单的 limit 子句。limit 子句声明如下:

limit 子句用于指定 select 语句返回的记录数,注意:

  • offset 指定第一个返回记录行的偏移量,默认为0初始记录行的偏移量是0,而非1
  • rows 指定返回记录行的最大数量rows 为 -1 表示检索从某个偏移量到记录集的结束所有的记录行。

若只给定一个参数:它表示返回最大的记录行数目。

从 orders_history 表查询offset: 1000开始之后的10条数据,即第1001条到第1010条数据(1001 <= id <= 1010)。

数据表中的记录默认使用主键(id)排序,上面结果等价于:

三次查询时间分别为:

针对这种查询方式,下面测试查询记录量对时间的影响:

三次查询时间:

在查询记录量低于100时,查询时间基本无差距,随查询记录量越来越大,消耗时间越多。

针对查询偏移量的测试:

三次查询时间如下:

随着查询偏移的增大,尤其查询偏移大于10万以后,查询时间急剧增加。

这种分页查询方式会从DB的第一条记录开始扫描,所以越往后,查询速度越慢,而且查询数据越多,也会拖慢总查询速度。

  • 前端加缓存、搜索,减少落到库的查询操作比如海量商品可以放到搜索里面,使用瀑布流的方式展现数据
  • 优化SQL 访问数据的方式直接快速定位到要访问的数据行。推荐使用"延迟关联"的方法来优化排序操作,何谓"延迟关联" :通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。
  • 使用书签方式 ,记录上次查询最新/大的id值,向后追溯 M行记录

优化前

执行时间:

优化后:

执行时间:

优化后 执行时间 为原来的1/3 。

首先获取符合条件的记录的最大 id和最小id(默认id是主键)

根据id 大于最小值或者小于最大值进行遍历。

当遇到延迟关联也不能满足查询速度的要求时

使用延迟关联查询数据510ms ,使用基于书签模式的解决方法减少到10ms以内 绝对是一个质的飞跃。

根据主键定位数据的方式直接定位到主键起始位点,然后过滤所需要的数据。

相对比延迟关联的速度更快,查找数据时少了二级索引扫描。但优化方法没有银弹,比如:

order by id desc 和 order by asc 的结果相差70ms ,生产上的案例有limit 100 相差1.3s ,这是为啥?

还有其他优化方式,比如在使用不到组合索引的全部索引列进行覆盖索引扫描的时候使用 ICP 的方式 也能够加快大分页查询。

先定位偏移位置的 id,然后往后查询,适于 id 递增场景:

4条语句的查询时间如下:

  • 1 V.S 2:select id 代替 select *,速度快3倍
  • 2 V.S 3:速度相差不大
  • 3 V.S 4:得益于 select id 速度增加,3的查询速度快了3倍

这种方式相较于原始一般的查询方法,将会增快数倍。

假设数据表的id是连续递增,则根据查询的页数和查询的记录数可以算出查询的id的范围,可使用 id between and:

查询时间:

这能够极大地优化查询速度,基本能够在几十毫秒之内完成。限制是只能使用于明确知道id。

另一种写法:

还可以使用 in,这种方式经常用在多表关联时进行查询,使用其他表查询的id集合,来进行查询:

已经不属于查询优化,这儿附带提一下。

对于使用 id 限定优化中的问题,需要 id 是连续递增的,但是在一些场景下,比如使用历史表的时候,或者出现过数据缺失问题时,可以考虑使用临时存储的表来记录分页的id,使用分页的id来进行 in 查询。这样能够极大的提高传统的分页查询速度,尤其是数据量上千万的时候。

一般在DB建立表时,强制为每一张表添加 id 递增字段,方便查询。

像订单库等数据量很大,一般会分库分表。这时不推荐使用数据库的 id 作为唯一标识,而应该使用分布式的高并发唯一 id 生成器,并在数据表中使用另外的字段来存储这个唯一标识。

先使用范围查询定位 id (或者索引),然后再使用索引进行定位数据,能够提高好几倍查询速度。即先 select id,然后再 select *。

  • https://segmentfault.com/a/1190000038856674

 

最新文章
什么是思维导图,在线思维导图对SEO有用吗?
在我多年的SEO优化与项目管理经历中,我发现,无论是策划内容框架还是梳理复杂信息,思维导图都是一个不可或缺的工具。它不仅帮助我更清晰地思考,还无形中促进了创意的碰撞。今天,我们就来聊聊什么是思维导图,以及在线思维导图在SEO优化
揭秘 SEO 按天扣费模式的猫腻,你知道多少?
关键词每日扣费一定靠谱吗?近年来,SEO行业形势不断发生变化,各种新的SEO计费方式和营销模式不断涌现。如今,大多数SEO公司都采用每日扣费的模式来吸引客户。事实上,每日抵扣模式还有很多技巧。今天,就带大家了解一下一家公司的日常扣
专业SEO关键词优化:提升网站排名,打造互联网流量利器
为了让您的网站在激烈的市场竞争中占据有利位置,进行精准的关键词优化是必不可少的。如何才能进行高效且专业的SEO关键词优化呢?我们将为您介绍几个关键的优化步骤。关键词研究是SEO优化的第一步,也是最为基础和重要的一步。通过关键词研
Copilot插件:时时陪伴的AI助手 | Obsidian实践
这段时间,有点儿沉迷于AIGC实践不可自拔,也因此懈怠了Obsidian实践。回过头来猛然发觉,其实Obsidian也“上架”了很多与ChatGPT有关的插件。赶紧体验下,看看有没有什么,是一下子就能用起来的。不得不说,自从我安装了Copilot插件,就再
seo优化推广如何 SEO优化推广效果与策略解析
SEO优化推广如何:掌握数字时代的营销利器在当今数字化迅猛发展的时代,企业的在线可见性和品牌影响力变得至关重要SEO(搜索引擎优化)作为一种有效的数字营销策略,不仅能够帮助企业在竞争激烈的市场中脱颖而出,还能带来持续、稳定的流量
宁波SEO服务热线汇总,助力网站快速提升排名抢占市场优势
宁波SEO厂商电话一览,为您提供专业SEO服务,助您快速提升网站排名,抢占市场先机。涵盖多家知名SEO公司,详尽联系方式,让您轻松选择,高效优化网站,助力企业发展。随着互联网的快速发展,企业对网络营销的需求日益增长,SEO(搜索引擎优
Python开发QQ聊天机器人——Yes酱的部署与调教
Yes酱是一个会发s图的群管理机器人,基于 go-cqhttp,使用OneBot标准的插件开发的一个机器人,支持以下功能:发送setu/猫猫图返回一张涩图/猫猫图检测关键字禁言私聊调教对话本文主要参考了其官方博客,结合Yes酱的github和go-cqhttp的gith
2024 (图文)Yoast SEO插件使用教程,详细设置步骤
  Yoast SEO是著排名第一的。插件有Yoast SEO(免费)和Yoast SEO Premium(付费)有两个版本  Yoast SEO可以完美地在所有类型的网站或上实现SEO相关的设置。可帮助您编写更好的且经过优化的内容让搜索引擎收录。该插件的免费版本还具
EyouCms(易优企业建站系统) 官网版 v3.5.6
EyouCms(易优企业建站系统)官方版是一款十分受欢迎的企业内容管理软件。EyouCms(易优企业建站系统)最新版支持文章的「发布、删除、移动、复制、排序、推荐、置顶、隐藏、显示」操作。EyouCms(易优企业建站系统)官方版支持设置每篇文章的「
【技术】全站仪测量使用方法及坐标计算,一步一步讲解!
全站仪常规注意事项:在使用本仪器之前, 要把各种注意事项烂熟于心,务必检查并确认该仪器各项功能运行正常。1、不要将仪器直接对准太阳将仪器直接对准太阳会严重伤害眼睛。若仪器的物镜直接对准太阳, 也会损坏仪器。2、将仪器架设到脚架
相关文章
推荐文章
发表评论
0评