MySQL线上优化_线上MySQL千万级大表,如何优化?

前段时间应急群有客服反馈,会员管理功能无法按到店时间、到店次数、消费金额进行排序。经过排查发现是 SQL 执行效率低,并且索引效率低下。

d408213022a86b309baabb897fc8bd0f.png

图片来自 Pexels

应急问题

商户反馈会员管理功能无法按到店时间、到店次数、消费金额进行排序,一直转圈圈或转完无变化,商户要以此数据来做活动,比较着急,请尽快处理,谢谢。

线上数据量

merchant_member_info:7000W 条数据。

member_info:3000W。

不要问我为什么不分表,改动太大,无能为力。

问题 SQL

问题 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

WHENu.nick_nameISNULLTHEN

'会员'

WHENu.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

LEFTJOINmember_info uONmui.member_id = u.id

WHERE

1 = 1

ANDmui.merchant_id ='商户编号'

ORDERBY

mui.recently_consume_time DESC/ASC

LIMIT 0,

10

出现的原因

经过验证可以按照“到店时间”进行降序排序,但是无法按照升序进行排序主要是查询太慢了。

主要原因是:虽然该查询使用建立了 recently_consume_time 索引,但是索引效率低下,需要查询整个索引树,导致查询时间过长。DESC 查询大概需要 4s,ASC 查询太慢耗时未知。

为什么降序排序快和而升序慢呢?

如下图:

0a381525431b122aae333bcf56d5d1ea.png

因为是对时间建立了索引,最近的时间一定在最后面,升序查询,需要查询更多的数据,才能过滤出相应的结果,所以慢。

解决方案

目前生产库的索引,如下图:

658506aeaa3a4a467c26bd34a29fc148.png

①调整索引

需要删除 index_merchant_user_last_time 索引,同时将 index_merchant_user_merchant_ids 单例索引,变为 merchant_id,recently_consume_time 组合索引。

②调整结果(准生产)

如下图:

2df5f62576d57eb281049741572fd53b.png

③调整前后结果对比(准生产)

测试数据:

merchant_member_info 有 902606 条记录。

member_info 表有 775 条记录。

④SQL 执行效率

优化前,如下图:

d7c35b33688491099e1def34a8988f4c.png

优化后,如下图:

1363c83a78c5223ff82429b8373dc678.png

type 由 index→ref,ref 由 null→const:

b213e6079c1d7c0a5312f76e59876ea8.png

调整索引需要执行的 SQL

执行的注意事项:由于表中的数据量太大,请在晚上进行执行,并且需要分开执行。

# 删除近期消费时间索引

ALTERTABLEmerchant_member_infoDROPINDEXindex_merchant_user_last_time;

# 删除商户编号索引

ALTERTABLEmerchant_member_infoDROPINDEXindex_merchant_user_merchant_ids;

# 建立商户编号和近期消费时间组合索引

ALTERTABLEmerchant_member_infoADDINDEXidx_merchant_id_recently_time (`merchant_id`,`recently_consume_time`);

经询问,重建索引花了 30 分钟。

最终的分页查询优化

上面的 SQL 虽然经过调整索引,虽然能达到较高的执行效率,但是随着分页数据的不断增加,性能会急剧下降。

9a9ae088255a303ced3ebe6f2b1c9762.png

最终的 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_amount,

(

CASE

WHENu.nick_nameISNULLTHEN

'会员'

WHENu.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

INNERJOIN(

SELECT

id

FROM

merchant_member_info

WHERE

merchant_id = '商户ID'

ORDERBY

recently_consume_time DESC

LIMIT 9000,

10

) AStmpONtmp.id = mui.id

LEFTJOINmember_info uONmui.member_id = u.id

作者:不一样的科技宅

编辑:陶家龙

出处:juejin.cn/post/6844904053239971854

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php创建表设置编码,教您在Zend Framework里如何设置数据库编码以及怎样给数据表设定前缀!...

当我们在开发项目时..大家都会遇到一个问题就是:数据库的编码问题.当然我们不用Zend Framework做为项目开发的框架时..我们可以很快,很容易搞定这个小问题..但是当我们要使用Zend Framewok开发项目时..我们可能一时会不知道如何解决这个小问题..比如我就是这样的人..在开发这个…

python 怎么将数组转为列表_怎么将视频转为GIF动态图 表情包怎么制作

说到GIF,大家应该都不陌生了吧!尤其是在聊天中使用较多,似乎一言不合就开启了斗图模式,但是我们平时使用的GIF一般都是软件中自带的,其实自己制作也是很方便的,而且会发现很有趣,不但可以直接录…

proteus里面没有stm32怎么办_嵌入式单片机之stm32串口你懂了多少!!

stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm32的视频资料便于学习参考。点击…

tomcat不能解析php,tomcat不支持php怎么办

tomcat不支持php的解决办法:首先将“PHP/Java Bridge”下的相关文件复制到tomcat的lib目录下;然后修改tomcat安装目录下conf文件夹里的“web.xml”文件;最后重启tomcat即可。java开发者都知道,tomcat是用来部署java web项目的。这…

c++ dicom图像切割_【高训智造】原创专业课堂第225期--定位滑座的线切割加工

原标题:【高训智造】原创专业课堂第225期--定位滑座的线切割加工欢迎来到【高训智造】原创专业课堂第225期,本期由郭沃沛老师给大家带来线切割小课堂。定位滑座的线切割加工郭沃沛1零件图如图1所示为定位滑座零件图,其材料为45钢,…

c iostream.源码_通达信指标公式源码精准买卖主图指标公式免费分享

V0:EMA(C,5),COLOR00FF66;V1:EMA(C,10),COLOR00FF66;V2:EMA(C,15),LINETHICK2,COLORFFFFFF;V3:EMA(C,30);V4:EMA(C,60),COLOR3366FF;年线:EMA(C,90),COLORBLUE;M1:1000*V1/V4<1015 AND 1000*V1/V4>975;M2:1000*V2/V4<1020 AND 1000*V2/V4>980;M3:1000*V3/V4<101…

4am永远 鼠标按键设置_4AM称霸PCL和PEL 绝地求生与和平精英的双端冠军 | 电玩巴士...

在《绝地求生》PCL秋季赛&#xff0c;4AM高分碾压全场斩获冠军&#xff1b;在手游和平精英PEL联赛上4AM战队再度重拳出击荣获S3总冠军。在同一时间&#xff0c;4AM战队实现了端游与手游双冠王的神迹&#xff01;要说国内第一大逃杀电竞俱乐部&#xff0c;4am自认第二&#xff0…

checkA.php,php window平台模拟checkdnsrr函数检测_php

在php的系统函数中有一个checkdnsrr函数&#xff0c;该函数的作用是根据一个给定的host name(域名)或者IP地址检查它是否有DNS记录&#xff0c;目的就是检验它是否真实存在。但是该函数仅可以在linux系统下使用&#xff0c;并不支持windows平台。下面是网上搜集到的一个hack的方…

oracle临时表经常被锁_【赵强老师】Oracle数据库的存储结构

Oracle的存储结构分为&#xff1a;物理存储结构和逻辑存储结构。一、物理存储结构&#xff1a;指硬盘上存在的文件数据文件(data file)一个数据库可以由多个数据文件组成的&#xff0c;数据文件是真正存放数据库数据的。一个数据文件就是一个操作系统文件。数据库的对象(表和索…

h5 nan_手把手教你将H5游戏打包成快游戏

H5游戏可以通过快应用的web组件快速打包成快游戏&#xff0c;打包上架后的快游戏&#xff0c;只要原H5游戏的url不发生变动&#xff0c;快游戏就不需要做更新&#xff0c;维护工作量小。使用快应用IDE&#xff0c;打包快游戏的操作很简单。访问官网安装开发工具&#xff0c;在P…

平板电脑有什么用_除了盖泡面,平板电脑没什么用了

平板电脑似乎变成一个鸡肋&#xff0c;逐渐没有多少人买了。就算拥有&#xff0c;抱在怀里把玩的机会少了&#xff0c;躺在角落吃灰的时候多了。曾经&#xff0c;没有人能拒绝平板电脑的诱惑。有了平板&#xff0c;你仿佛跻身上流社会。不经意间拿出时的从容&#xff0c;打开皮…

java程序面向对象show,20165309 实验二 Java面向对象程序设计

2017-2018-2 20165309实验二《Java面向对象程序设计》实验报告一、实验内容1. 初步掌握单元测试和TDD2. 理解并掌握面向对象三要素&#xff1a;封装、继承、多态3. 初步掌握UML建模4. 熟悉S.O.L.I.D原则5. 了解设计模式二、实验步骤(一)单元测试1.三种代码&#xff1a;伪代码、…

jade软件_TEM衍射斑点标定之DM软件

虽然透射电子显微镜(TEM) 能在纳米尺度上实现对待测样品形貌、 尺寸的分析&#xff1b; 结合选区电子衍射(SAED)&#xff0c;可以更进一步实现对待测样品的晶体结构、 晶相组成的鉴定&#xff0c;从而提高样品分析的准确度和可靠性。可是&#xff0c;每个刚接触TEM的小白&#…

dorado 7 怎么样_一点点奶茶怎么样?消费者眼中的网红奶茶

最近在朋友圈, -款奶茶火速蹿红,不错,那正是近期疯传的网红奶茶一点点奶茶。一点点奶茶是-款主打台湾正宗波霸奶茶的茶饮品牌,而这样的奶茶在现在的市场中就表现的十分有潜力, 尤其受年轻群体的喜欢!一点点奶茶怎么样?它的崛起是无可厚非的,它那美丽的外形,别具-格的属性&…

gatewayproperties 是空_杨丞琳演唱会踩空,从二楼高台掉到一楼,手脚擦伤,引发网友热议...

11月6日&#xff0c;据台湾媒体报道&#xff0c;杨丞琳今晚在台北举办连续三天的演唱会&#xff0c;她开场在两层楼高的高台上唱歌&#xff0c;结束后意外从高台踩空掉到一楼&#xff0c;从二楼高台掉到一楼&#xff0c;手脚擦伤。引发网友们的热议。当时幸好身边有工作人员抱住…

easyx 备忘录_报到?上课?我被自己的备忘录骗到了

2020年6月的某一天小莔被一股神秘力量支配打开了手机里的备忘录突然发现了自己曾经记录下的一则消息小莔现在看到真的是回忆满满从一月到现在我们经历了许多变数看到了世间的温暖感受到了爱与希望其中遇到的一些感动我们可能会忘记就像我们成长的过程中也会经历很多要做许多事情…

基于matlab的ldpc编码的构造,基于LDPC编码的GMSK调制与解调及matlab仿真实现(含录像)...

基于LDPC编码的GMSK调制与解调及matlab仿真实现(含录像)(开题报告,论文10700字,程序代码,录像)摘 要随着无线通信技术的不断发展与进步&#xff0c;数字电视广播、移动视频点播等对数据吞吐量要求很高的业务逐渐变得可能。为了在有限的带宽内用有限的发射功率保证信息在空间传播…

linux查看内存_嵌入式操作系统的内存,你了解多少?

关注、星标公众号&#xff0c;不错过精彩内容来源&#xff1a;EDN电子技术设计linux 内存是后台开发人员&#xff0c;需要深入了解的计算机资源。合理的使用内存&#xff0c;有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局&#xff0c;内存碎片产生…

结构体内部申请空间_墙体的重要承重结构以及作用方向分类

内容提要&#xff1a;墙体是房屋的重要承重结构&#xff0c;墙体也是建筑物的主夏围护结构。其造价、工程量和自重往往是建筑物所有构件中所占份額最大的&#xff0c;因此在建筑设计中&#xff0c;合理地选择墙体的材料、结构方案、构造做法十分重要。墙体在建筑物中所处的不同…

fastcopy比正常复制快多少_高中三年,每个阶段考多少分才正常?快对比一下

原标题&#xff1a;高中三年&#xff0c;每个阶段考多少分才正常&#xff1f;快对比一下高一阶段众所周知&#xff0c;在高一阶段并没有文理科之分&#xff0c;除去英语、语文、数学&#xff0c;还有政、史、地、理、化、生六门课程。语数外各占150分&#xff0c;另外6门各占10…