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,一经查实,立即删除!

相关文章

java底层怎么学_java学习----底层原理一

数据类型java自带8种基本类型,4中整型类型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型,和1种用于表示真值的bool类型(这8种基本类型都有自己的隐式初始值)。long在申请变量时赋值数据后必须加l或L,若不加…

java实验报告合肥工业大学_合肥工业大学数据结构上机实验代码与实验报告(全)github地址...

C++实现链队类——合肥工业大学数据结构实验5:链式队列实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 5.2 实验要求 5.2.1链队列实验要 …

php 类分开写,自己前几天写的无限分类类_PHP教程

自己前几天写的无限分类类_PHP教程前一周写的吧,使用中效果还不错。主要思想来自:http://www.phpobject.net/b...[urlhttp://www.phpobject.net/blog/read.php?49][/url]这里就不多解释原理了,直接发代码。PS:这里代码是不能直接使用的&…

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

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

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

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

curl php 百度,php curl 模拟登录百度主页

php curl 模拟登录百度首页本帖最后由 STONEWP 于 2012-03-29 13:43:04 编辑代码如下:$url "https://passport.baidu.com/?login&tplmn";//$url "http://www.baidu.com/";$cookdir "d:/www/html/mndl/cookie.txt";$ch curl_…

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钢,…

php.ini配置详解 号,php INI配置文件的解析实现分析

我不知道怎么说才好,因为我在读INI文件的时候,往往都是用现成的函数:parse_ini_file或者是parse_ini_string,但怎么写入,就是另外的方法了(自己实现。。。。)所以看到这篇文章的时候,我也才刚刚知道&#x…

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;数据文件是真正存放数据库数据的。一个数据文件就是一个操作系统文件。数据库的对象(表和索…

php页面的循环输出数组,PHP抓取页面上的数组 并循环输出 急

PHP抓取页面上的数组 并循环输出 急 在线等我用file_get_contents()抓取了 这个网址上的内容http://simonfenci.sinaapp.com/index.php?keysimon&wd1314abc看似好像反回的是数组。。但是我不管怎么用foreach循环都报错。。我只想把数组中的word里面的值 取出来。。谁帮帮我…

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

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

php 构造函数 返回值,php构造函数与析构函数实例分析

本节内容&#xff1a;php构造函数与析构函数例子&#xff1a;复制代码 代码示例:class Person{public $name;public $age;public function __construct($name,$age){$this->name $name;$this->age $age;}function __destruct(){echo $this->name."销毁资源&…

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

平板电脑似乎变成一个鸡肋&#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;伪代码、…

php dom 丢失内容,PHP DOMDocument缺失

我在运行$dom new DOMDocument(“1.0”,“utf-8”)时遇到一个奇怪的错误&#xff1a;警告&#xff1a;require_once(classes / DOMDocument.class.php)[function.require-once]&#xff1a;无法打开流&#xff1a;第5行的/var/www/html/cms/bootstrap.php中没有这样的文件或目…