千万级数据深分页查询SQL性能优化实践

2023-08-23 12:37:26 来源: 博客园
一、系统介绍和问题描述

如何在Mysql中实现上亿数据的遍历查询?先来介绍一下系统主角:关注系统,主要是维护京东用户和业务对象之前的关注关系;并对外提供各种关系查询,比如查询用户的关注商品或店铺列表,查询用户是否关注了某个商品或店铺等。但是最近接到了一个新需求,要求提供查询关注对象的粉丝列表接口功能。该功能的难点就是关注对象的粉丝数量过多,不少店铺的粉丝数量都是千万级别,并且有些大V粉丝数量能够达到上亿级别。而这些粉丝列表数据目前全都存储在Mysql库中,然后通过业务对象ID进行分库分表,所有的粉丝列表数据分布在16个分片的256张表中。同时为了方便查询粉丝列表,同一个业务对象的所有粉丝都会路由到同一张表中,每个表的数据量都能够达到 2 亿+。

二、解决问题的思路和方法

数据库表结构示例如下:


(资料图片)

CREATE TABLE follow_fans_[0-255]  (    id bigint(11) NOT NULL AUTO_INCREMENT COMMENT "自增id",    biz_content   VARCHAR(50) DEFAULT NULL COMMENT "业务对象ID",    source        VARCHAR(50) DEFAULT NULL COMMENT "来源",    pin           VARCHAR(50) DEFAULT NULL COMMENT "用户pin",    ext           VARCHAR(5000) DEFAULT NULL COMMENT "扩展信息",    status        TINYINT(2) DEFAULT 1 COMMENT "状态,0是失效,1是正常",    created_time  DATETIME DEFAULT NULL COMMENT "创建时间",    modified_time DATETIME DEFAULT NULL COMMENT "修改时间",    PRIMARY KEY(id),    UNIQUE INDEX uniq_biz_content_pin (biz_content, pin)  )  ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT = "关注粉丝表";
Limit实现

由于同一个业务对象的所有粉丝都保存到一张数据库表中,对于分页查询列表接口,首先想到的就是用limit实现,对于粉丝数量很少的关注对象,查询接口性能还不错。但是随着关注对象的粉丝数量越来越多,接口查询性能就会越来越慢。后来经过接口压测,当业务对象粉丝列表数量达到几十万级别的时候,查询页码数量越大,查询耗时越多。limit深分页为什么会变慢?这就和sql的执行计划有关了,limit语句会先扫描offset+n行,然后再丢弃掉前offset行,返回后n行数据。也就是说limit 100000,10,就会扫描100010行,而limit 0,10,只扫描10行。查询 sql 示例如下:

select  id,biz_content,pin FROM follow_fans_1 where biz_content = #{bizContent} order by id desc limit 10, 10;
方案优点:实现简单,支持跳页查询。方案缺点:数据量变大时,随着查询页码的深入,查询性能越来越差。标签记录法

Limit深分页问题的本质原因就是:偏移量(offset)越大,mysql就会扫描越多的行,然后再抛弃掉,这样就导致查询性能的下降。所以我们可以采用标签记录法,就是标记一下上次查询到哪一条了,下次再来查的时候,从该条开始往下扫描。具体做法方式是,查询粉丝列表中按照自增主键ID倒序查询,查询结果中返回主键ID,然后查询入参中增加maxId参数,该参数需要透传上一次请求粉丝列表中最后一条记录主键ID,第一次查询时可以为空,但是需要查询下一页时就必传。最后根据查询时返回的行数是否等于 10 来判断整个查询是否可以结束。优化后的查询sql参考如下:

select id,biz_content,pin FROM follow_fans_1 where biz_content = #{bizContent} and id < #{lastId} order by id desc limit 10;
方案优点:避免了数据量变大时,页码查询深入的性能下降问题;经过接口压测,千万级数据量时,前 N-1页查询耗时可以控制在几十毫秒内。方案缺点:只能支持按照页码顺序查询,不支持跳页,而且仅能保证前 N-1 页的查询性能;如果最后一页的表中行数量不满 10 条时,引擎不知道何时终止查询,只能遍历全表,所以当表中数据量很大时,还是会出现超时情况。区间限制法

标签记录法最后一页查询超时就是因为不知道何时终止查询,所以我们可以提供一个区间限制范围来告诉引擎查询到此结束。

查询sql再次优化后参考如下:

select id,biz_content,pin FROM follow_fans_1 where biz_content = #{bizContent} and id < #{lastId} and id >={minId} order by id desc limit 10;

由于查询时需要带上 minId 参数,所以在执行查询粉丝列表之前,我们就需要先把 minId 查询出来,查询 sql 参考如下:

select min(id) from follow_fans_1 where biz_content = #{bizContent}

由于表中数据量太大,每个表中总数据量都是上亿级别,导致第一步查询 minId就直接超时了,根本没有机会去执行第二步。但是考虑到上一个查询方案只有最后一页才会查询超时,前N-1页查询根本用不到 minId 作为区间限制。所以当表中数据量很大时,通常从第一页到最后一页查询之间会存在一定的时间差。我们就可以正好去利用这个时间差去异步查询minId,然后将查询出来的minId存储到缓存中,考虑到这个 minId 可能会被删除,可以设置一定的过期时间。最后优化后的查询流程如下:

调用查询粉丝列表方法时首先查询缓存minId;如果缓存minId 为空,则创建异步任务去执行select min(id) 查询表中的 minId,然后回写缓存,该异步任务执行时间可能会很长,可以单独设置超时时间。如果缓存minId不为空,则在查询sql中拼接查询条件id >={minId},从而保证查询最后一页时不会超时。

但是在上述方案中,如果表中的数据量达到上亿级别时,第二步的异步获取minId任务还是会存在超时的风险,从而导致查询最后一页粉丝列表出现超时。所以我们又引入了离线数据计算任务,通过在大数据平台离线计算获取每个biz_content下的minId,然后将计算结果minId推送到缓存中。为了保证minId能够及时更新,我们可以自由设置该离线任务的执行周期,比如每周执行一次。通过大数据平台的离线计算minId,从而大大减少了在查询粉丝列表时执行 select min(id)的业务数据库压力。只有当缓存没有命中的时候才去执行 select min(id),通常这些缓存没有命中的 minId 也都是一些被离线任务遗漏的少量数据,不会影响接口的整体查询性能。

方案优点:避免了数据量变大时,页码查询深入的性能下降问题;经过接口压测,千万级数据量时,从第一页到最后一页都控制在几十毫秒内。方案缺点:只能支持按照页码顺序和主键ID倒序查询,不支持跳页查询,并且还需要依赖大数据平台离线计算和额外的缓存来存储 minId。三、对SQL优化治理的思考

通过对以上三种方案的探索实践,发现每一种方案都有自己的优缺点和它的适用场景,我们不能脱离实际业务场景去谈方案的好坏。所以我们要结合实际的业务环境以及表中数据量的大小去综合考虑、权衡利弊,然后找到更适合的技术方案。以下是总结的几条SQL优化建议:

查询条件一定要有索引

索引主要分为两大类,聚簇索引和非聚簇索引,可以通过 explain 查看 sql 执行计划判断查询是否使用了索引。

聚簇索引 (clustered index):聚簇索引的叶子节点存储行记录,InnoDB必须要有且只有一个聚簇索引:

如果表定义了主键,则主键索引就是聚簇索引;如果没有定义主键,则第一个非空的唯一索引列是聚簇索引;如果没有唯一索引,则创建一个隐藏的row-id列作为聚簇索引。主键索引查询非常快,可以直接定位行记录。

非聚簇索引 (secondary index):InnoDB非聚簇索引的叶子节点存储的是行记录的主键值,而MyISAM叶子节点存储的是行指针。 通常情况下,需要先遍历非聚簇索引获得聚簇索引的主键ID,然后在遍历聚簇索引获取对应行记录。

正确使用索引,防止索引失效

可以参考以下几点索引原则:

最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如 a=1 and b=2 and c>3 and d=4 ,如果建立了(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a、b、d的顺序可以任意调整。=和in可以乱序,比如 a=1 and b=2 and c=3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮助优化成索引可以识别的形式。尽量选择区分度高德列作为索引,区分度公式count(distinct col)/count(*),表示字段不重复的比例。索引列不能使用函数或参与计算,不能进行类型转换,否则索引会失效。尽量扩展索引,不要新建索引。减少查询字段,避免回表查询

回表查询就是先定位主键值,在根据主键值定位行记录,需要扫描两遍索引。 解决方案:只需要在一颗索引树上能够获取SQL所需要的所有列数据,则无需回表查询,速度更快。可以将要查询的字段,建立到联合索引里去,这就是索引覆盖。查询sql在进行explain解析时,Extra字段为Using Index时,则触发索引覆盖。没有触发索引覆盖,发生了回表查询时,Extra字段为Using Index condition。

作者:京东零售 曹志飞

来源:京东云开发者社区 转载请注明来源

标签:

千万级数据深分页查询SQL性能优化实践

最近接到了一个新需求,要求提供查询关注对象的粉丝列表接口功能。该功

08-23 12:37:26

关爱“小候鸟”,心系工地情

工人日报-中工网记者柳姗姗彭冰通讯员徐孝忠近日,中铁上海局沈白高铁

08-23 11:17:41

佳都科技:8月22日融资买入615.97万元,融资融券余额9.34亿元

8月22日,佳都科技(600728)融资买入615 97万元,融资偿还1178 11万元

08-23 10:03:29

哈尔滨市属国企改革重组整合取得阶段性成果

上半年,哈尔滨市地方国有企业主要经济指标保持较快增速,如期实现“双

08-23 09:00:21

小米超级月亮是真的吗

小米超级月亮是真的还是合成的小米超级月亮的真实性小米公司表示,这组

08-23 07:18:38

山东黄金(01787.HK):8月22日南向资金增持36.72万股

8月22日北向资金增持36 73万股山东黄金(01787 HK)。近5个交易日中,

08-23 03:49:27

锂电隔膜行业迎洗牌?星源材质董事长:落后产能将被淘汰 中高端产能仍不足

“面对市场竞争,星源材质花了5年时间打造第五代超级湿法线,这是非常

08-22 22:43:32

盈建科最新公告:上半年净亏损1227.3万元

盈建科公布2023年半年度报告,报告期营业收入7313 02万元,同比下降6 1

08-22 21:03:27

中国泰国老挝三国驻缅甸大使馆协调打击赌诈问题

8月22日,陈海大使同泰国驻缅甸大使蒙空、老挝驻缅甸大使恒显举行三方

08-22 19:38:28

东平农商银行开展金融知识普及“利率”知多少宣传活动

东平农商银行开展金融知识普及“利率”知多少宣传活动,贷款,东平农商银

08-22 18:30:50

同程旅行Q2财报:营收28.7亿元,同比增长117.4%

新浪科技讯8月22日下午消息同程旅行发布2023年第二季度及上半年业绩报

08-22 17:17:50

片仔癀原董事长刘建顺严重违纪违法被开除党籍

中新网8月22日电据漳州纪委监委微信公众号22日消息,日前,经中共漳州

08-22 16:14:53

韩国女团权珉娥14岁被轮奸!曾自曝遭队员霸凌、裸聊赚钱反被骗8w

8月21日,韩国女团AOA前成员权珉娥登上热搜榜,原因是因为在14岁的时候

08-22 15:24:51

老外素质都高?自行车之都荷兰尴尬:这种车90%被偷 保险都拒保

自行车之都荷兰也是够闹心的,国内自行车被偷的厉害,保险公司都拒保了

08-22 14:07:23

张家口打造最优营商环境 列好优化交通运输营商环境方程式

“12328”交通运输服务监督热线运行质量连续六个月排名全省第一、张石

08-22 12:59:33

中国银河给予国能日新推荐评级,主业SaaS稳定增长,创新业务持续放量

每经AI快讯,中国银河08月22日发布研报称,给予国能日新(301162 SZ,

08-22 11:51:08

公安部:今年以来全国枪爆犯罪案件同比下降16%

公安部:今年以来全国枪爆犯罪案件同比下降16%

08-22 11:01:26

海南文昌航天产业集群效应初显 重大项目相继落地

(张月和)“截至2023年6月,园区的营业收入、税收收入、固定投资分别是

08-22 10:12:57

挡道啦!“泥”不要过来啊

“瓯海新桥沉木桥街与上河乡路交叉口附近黄土成堆,下雨天泥巴被雨水冲

08-22 09:24:29

远东股份(600869) 涨跌幅:-3.42% (08/21)

远东股份(600869)今收:涨跌幅:-%主力控盘:机构参与度为%,属于轻度控

08-22 08:22:54

临汾:全民健身10K挑战赛点燃城市活力

临汾:全民健身10K挑战赛点燃城市活力,主流媒体,山西门户。山西新闻网

08-22 06:58:44

转转平台验机过程_转转平台验机流程

你们好,最近小活发现有诸多的小伙伴们对于转转平台验机过程,转转平台

08-22 03:35:04

贝壳:斥资30亿元认购建信理财产品,期限273天

8月21日,贝壳控股有限公司(NYSE:BEKE;02423 HK)发布认购理财产品

08-21 22:38:39

【好物】三星平板/手表/耳机新品京东立打9折,1C+2A魔方插头19.9元破冰新低

京东自营现已开启新品限时狂促活动,凡在“三星京东自营官方旗舰店”购

08-21 21:04:05

男子夜钓超时不离场,凌晨4点独自下水后溺亡,法院:自担责任

近日,中山市第一人民法院公布一起责任纠纷案件。据了解,2022年7月6日

08-21 19:42:49

爱玛科技半年度总营收102.17亿元,同比增长8.25%

8月22日,爱玛科技发布2023年中报,公司实现营业总收入102 17亿元,同

08-21 18:25:22

中银证券投顾“无证上岗”收警示函 下半年来多家券商触相同红线被处罚

中国网是国务院新闻办公室领导,中国外文出版发行事业局管理的国家重点

08-21 17:27:44

从自身条件出发,看哪种落户上海的方式最快最适合自己

很多想落户上海的人,第一个关心的问题是怎么知道哪种落户方式最适合自

08-21 16:26:30

国家安全机关又公布一起美国中央情报局间谍案!

国家安全机关又公布一起美国中央情报局间谍案!,

08-21 15:36:34

让中餐更好地走向世界 中英餐饮届代表在伦敦座谈交流

(许立群、余颖)当地时间8月17日,由世界中餐业联合会和英国中餐联合会

08-21 14:41:36

浙江一男子外卖点馒头,等送来后硬得像砖头,老板还讽刺他素质低

都知道点外卖就是为了吃,不过有时也会碰到问题,比如漏装或什么东西不

08-21 13:22:22

如何将谷歌日历添加到Outlook

Google日历和MicrosoftOutlook是出色的互联网日历,可以与各自的电子邮

08-21 12:01:08

华为梁华:夯实智能算力底座,助力高质量发展

8月19日,2023中国算力大会在宁夏银川举行,华为公司董事长梁华出席大

08-21 11:12:38

云南能投与会泽县政府签订470MW风电场合作协议

北极星风力发电网讯,8月17日,会泽县人民政府与云南能源投资股份有限

08-21 10:18:50

石家庄市开展大型户外广告设施安全隐患排查 防范意外事故发生

石家庄市开展大型户外广告设施安全隐患排查防范意外事故发生

08-21 09:18:04

“月月十九查酒”行动突击检查海沧酒类经营企业

执法人员正在检查金门高粱酒。(本报记者陈泥摄)为持续加强对酒类产品

08-21 07:52:45

汉字部首表_重字的部首

你们好,最近小活发现有诸多的小伙伴们对于汉字部首表,重字的部首这个

08-21 04:37:48

最简单的织帽子方法 最简单的织帽子方法简述)

hello大家好,我是城乡经济网小晟来为大家解答以上问题,最简单的织帽

08-20 22:16:52

感受明代文物之美|“百子衣”亮相昌平时尚街区

“百子衣”亮相昌平时尚街区

08-20 20:13:10

德马科技:上半年归母净利润同比涨2.73%

德马科技8月20日公告,公司上半年实现营业收入6 23亿元,同比下滑2 86%

08-20 17:50:06

淘宝人生的公众号叫什么(微信领淘宝卷公众号)

小评来为大家解答以上问题。淘宝人生的公众号叫什么,微信领淘宝卷公众

08-20 15:58:26

平安夜怎么过(在平安夜怎样过)

欢迎观看本篇文章,小富来为大家解答以上问题。平安夜怎么过,在平安夜

08-20 14:00:21

2023上海书展|6万文字、近800幅珍贵照片 回溯孙道临和王文娟艺术生涯中难忘瞬间

”上世纪30年代,电影艺术家孙道临和“越剧”名家王文娟,各自从北京和

08-20 11:55:40

NASA 将探索一颗金属小行星,期望解开地球内核之谜

IT之家8月20日消息,NASA计划于10月5日发射一艘太空飞船Psyche,前往距

08-20 10:15:39

晕车生姜贴手腕图片(怎么治晕车最有效)

1、上车之前最好不要吃偏稀的东西,不要喝太多水,不要盯着手机看,视

08-20 08:18:16

再爱一个男人,也要和他划清这两条“线”

不可否认,爱情是会激发一个人的占有欲的。在初识阶段,可能还会相对保

08-20 05:21:02

丰台区“欢迎学子回家” 举办活动30余场 吸引数万名丰台学子参与

欣赏湿地风光、绝色美景,体验中华传统艺术应节戏的精彩绝伦;中式插花

08-19 22:59:08

nba是什么意思(aba是什么意思)

文章目录1、nba是什么意思的缩写2、NBA的中文是什么意思3、nba是什么意

08-19 20:14:04

关于新冠病毒EG.5变异株相关科普问答

一、新冠病毒EG 5变异株是什么?EG 5变异株为新冠病毒奥密克戎XBB 1 9

08-19 18:01:19

逗女孩开心的聊天套路100句(逗女孩开心)

诸多的对于逗女孩开心的聊天套路100句,逗女孩开心这个问题都颇为感兴

08-19 15:58:30

关爱“小候鸟”,心系工地情
佳都科技:8月22日融资买入615.97万元,融资融券余额9.34亿元
哈尔滨市属国企改革重组整合取得阶段性成果
小米超级月亮是真的吗
山东黄金(01787.HK):8月22日南向资金增持36.72万股
锂电隔膜行业迎洗牌?星源材质董事长:落后产能将被淘汰 中高端产能仍不足
盈建科最新公告:上半年净亏损1227.3万元
中国泰国老挝三国驻缅甸大使馆协调打击赌诈问题
东平农商银行开展金融知识普及“利率”知多少宣传活动
同程旅行Q2财报:营收28.7亿元,同比增长117.4%
片仔癀原董事长刘建顺严重违纪违法被开除党籍
韩国女团权珉娥14岁被轮奸!曾自曝遭队员霸凌、裸聊赚钱反被骗8w
老外素质都高?自行车之都荷兰尴尬:这种车90%被偷 保险都拒保
张家口打造最优营商环境 列好优化交通运输营商环境方程式
中国银河给予国能日新推荐评级,主业SaaS稳定增长,创新业务持续放量
公安部:今年以来全国枪爆犯罪案件同比下降16%
海南文昌航天产业集群效应初显 重大项目相继落地
挡道啦!“泥”不要过来啊
远东股份(600869) 涨跌幅:-3.42% (08/21)
临汾:全民健身10K挑战赛点燃城市活力
转转平台验机过程_转转平台验机流程
贝壳:斥资30亿元认购建信理财产品,期限273天
【好物】三星平板/手表/耳机新品京东立打9折,1C+2A魔方插头19.9元破冰新低
男子夜钓超时不离场,凌晨4点独自下水后溺亡,法院:自担责任
爱玛科技半年度总营收102.17亿元,同比增长8.25%
中银证券投顾“无证上岗”收警示函 下半年来多家券商触相同红线被处罚
从自身条件出发,看哪种落户上海的方式最快最适合自己
国家安全机关又公布一起美国中央情报局间谍案!
让中餐更好地走向世界 中英餐饮届代表在伦敦座谈交流
浙江一男子外卖点馒头,等送来后硬得像砖头,老板还讽刺他素质低
如何将谷歌日历添加到Outlook
华为梁华:夯实智能算力底座,助力高质量发展
云南能投与会泽县政府签订470MW风电场合作协议
石家庄市开展大型户外广告设施安全隐患排查 防范意外事故发生
“月月十九查酒”行动突击检查海沧酒类经营企业
汉字部首表_重字的部首
最简单的织帽子方法 最简单的织帽子方法简述)
感受明代文物之美|“百子衣”亮相昌平时尚街区
德马科技:上半年归母净利润同比涨2.73%
淘宝人生的公众号叫什么(微信领淘宝卷公众号)
平安夜怎么过(在平安夜怎样过)
2023上海书展|6万文字、近800幅珍贵照片 回溯孙道临和王文娟艺术生涯中难忘瞬间
NASA 将探索一颗金属小行星,期望解开地球内核之谜
晕车生姜贴手腕图片(怎么治晕车最有效)
再爱一个男人,也要和他划清这两条“线”
丰台区“欢迎学子回家” 举办活动30余场 吸引数万名丰台学子参与
nba是什么意思(aba是什么意思)
关于新冠病毒EG.5变异株相关科普问答
逗女孩开心的聊天套路100句(逗女孩开心)
剧透来了!公益微电影《灯》花絮抢“鲜”看
X 广告
资讯
X 广告

Copyright ©  2015-2023 华夏畜牧网版权所有  备案号:琼ICP备2022009675号-37   联系邮箱:435 227 67@qq.com