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.pswp.cn/news/532327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532327.shtml
英文地址,請注明出處:http://en.pswp.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中沒有這樣的文件或目…