时间:2021-07-15 | 标签: | 作者:Q8 | 来源:不一样的科技宅网络
小提示:您能找到这篇{腾讯云:线上千万级大表排序该如何优化?}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的腾讯云:线上千万级大表排序该如何优化?内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您! |
< ">前言 < ">前段时间应急群有客服反馈,会员管理功能无法按到店时间、到店次数、消费金额进行排序。经过排查发现是Sql执行效率低,并且索引效率低下。遇到这样的情况我们该如何处理呢?今天我们聊一聊Mysql大表查询优化。 < ">应急问题 < ">商户反馈会员管理功能无法按到店时间、到店次数、消费金额进行排序,一直转圈圈或转完无变化,商户要以此数据来做活动,比较着急,请尽快处理,谢谢。 < ">线上数据量 < ">< background-color: rgb(242, 242, 242);">merchant_member_info 7000W条数据。 < ">< background-color: rgb(242, 242, 242);">member_info 3000W。 < ">不要问我为什么不分表,改动太大,无能为力。 < ">问题SQL如下 SELECT mui.id, mui.merchant_id, mui.member_id, DATE_FORMAT( mui.recently_consume_time, '%Y%m%d%H%i%s' ) recently_consume_time, IFNULL(mui.total_consume_num, 0) total_consume_num, IFNULL(mui.total_consume_amount, 0) total_consume_amount, ( CASE WHEN u.nick_name IS NULL THEN '会员' WHEN u.nick_name = '' THEN '会员' ELSE u.nick_name END ) AS 'nickname', u.sex, u.head_image_url, u.province, u.city, u.country FROM merchant_member_info mui LEFT JOIN member_info u ON mui.member_id = u.id WHERE 1 = 1 AND mui.merchant_id = '商户编号' ORDER BY mui.recently_consume_time DESC / ASC LIMIT 0, 10 < ">出现的原因 < ">经过验证可以按照“到店时间”进行降序排序,但是无法按照升序进行排序主要是查询太慢了。主要原因是:虽然该查询使用建立了recently_consume_time索引,但是索引效率低下,需要查询整个索引树,导致查询时间过长。 DESC查询大概需要4s,ASC查询太慢耗时未知。 < ">为什么降序排序快和而升序慢呢? < ">因为是对时间建立了索引,最近的时间一定在最后面,升序查询,需要查询更多的数据,才能过滤出相应的结果,所以慢。 < ">解决方案 < ">目前生产库的索引 < ">调整索引 < ">需要删除< background-color: rgb(242, 242, 242);">index_merchant_user_last_time索引,同时将< background-color: rgb(242, 242, 242);">index_merchant_user_merchant_ids单例索引,变为< background-color: rgb(242, 242, 242);">merchant_id,recently_consume_time组合索引。 < ">调整结果(准生产) < ">调整前后结果对比(准生产) < ">测试数据 < ">< background-color: rgb(242, 242, 242);">merchant_member_info有902606条记录。 < ">< background-color: rgb(242, 242, 242);">member_info表有775条记录。 < ">SQL执行效率 < ">优化前 < "> < ">优化后 < "> < ">type由index->ref < ">ref由null->const < ">调整索引需要执行的SQL 执行的注意事项: 由于表中的数据量太大,请在晚上进行执行,并且需要分开执行。 #删除近期消费时间索引 ALTER TABLE merchant_member_info DROP INDEX index_merchant_user_last_time; #删除商户编号索引 ALTER TABLE merchant_member_info DROP INDEX index_merchant_user_merchant_ids; #建立商户编号和近期消费时间组合索引 ALTER TABLE merchant_member_info ADD INDEX idx_merchant_id_recently_time(`merchant_id`,`recently_consume_time`); 经询问,重建索引花了30分钟。 < ">最终的分页查询优化 < ">上面的sql虽然经过调整索引,虽然能达到较高的执行效率海底捞危机公关发布会,但是随着分页数据的不断增加,性能会急剧下降。 < ">最终的sql < ">优化思路:先走覆盖索引定位到,需要的数据行的主键值,然后INNER 太原代运营JOIN回原表,取到其他数据。 SELECT mui.id, mui.merchant_id, mui.member_id, DATE_FORMAT( mui.recently_consume_time, '%Y%m%d%H%i%s' ) recently_consume_time, IFNULL(mui.total_consume_num, 0) total_consume_num, IFNULL(mui.total_consume_amount, 0) total_consume_am精确搜索ount, ( CASE WHEN u.nick_name IS NULL THEN '会员' WHEN u.nick_name = '' THEN '会员' ELSE u.nick_name END ) AS 'nickname', u.sex, u.head_image_url, u.province, u.city, u.country FROM merchant_member_info mui INNER JOIN ( SELECT id FROM merchant_member_info WHERE merchant_id = '商户ID' ORDER BY recently_consume_time DESC LIMIT 9000, 10 ) AS tmp ON tmp.id = mui.id LEFT JOIN member_info u ON mui.member_id = u.id |
上一篇:Bing动态搜索广告的作用是什么?
下一篇:如何获取Instagram上照片或视频的链接
基于对传统行业渠道的理解,对互联网行业的渠道我们可以下这样一个定义:一切...
小米应用商店的后台操作和苹果是比较相似的,因为都能填写100字符关键词,允许...
小米的规则目前是在变更中的,但是根据经验小米的搜索排名评分的高低是个很重...
为了恰饭,有时候是要接入一些广告的,所以FB也专门有一个广告的SDK,这就是A...
在 2018 年于旧金山举行的游戏开发者大会上,Amazon Web Services (AWS) 曾宣布,目前世...
关于Facebook Audience Network如何收款的问题,其实官方已经给了详细的步骤。本文主要...
本文介绍了Audience Network对广告载体的质量检查,以及它重点广告形式需要注意的问...
随着iOS开发,作为开发者或公司需要针对iOS App开发涉及的方方面面作出对应的信息...
Facebook和谷歌对出海企业广告渠道都很熟悉,但事实上,在国外还有一些渠道也很...
卖家从做号的第1分钟开始,就一定要想好变现路径是什么?一定要以变现为目的去...
小提示:您应该对本页介绍的“腾讯云:线上千万级大表排序该如何优化?”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通腾讯云:线上千万级大表排序该如何优化?的相关事宜。
关键词:腾讯云:线上千万级大表