IT技術互動交(jiao)流平台

凤凰体彩官网

作者︰whl  來(lai)源(yuan)︰網(wang)絡整理(li)  發布日期︰2020-02-26 14:40:00

  最(zui)近小編收到身邊朋友的反饋(kui)說是在MariaDB(MySQL)里對連接進行查(cha)詢的時候(hou)發現其性能真是一(yi)塌糊涂,讓人不忍直視。小編查(cha)找(zhao)了(liao)資料後發現了(liao)一(yi)個特別簡(jian)單(dan)的辦法(fa)來(lai)解決(jue)這個MariaDB SQL速度慢的問(wen)題,那就是通過Unix 命令(ling)來(lai)運行,然後你(ni)會發現查(cha)詢的時候(hou)縮(suo)短了(liao)起碼30倍以上(shang),十分(fen)驚人。

  下面就是這個查(cha)詢,它(ta)是 GHTorrent 分(fen)析的一(yi)部分(fen),我使用了(liao)關系在線分(fen)析處理(li)框架 simple-rolap 來(lai)實現zhong)飧齜fen)析。

 simple-rolap

  兩(liang)個連接字段都(du)有(you)索引。不過,MariaDB 是通過對 project_commits 進行全表掃描和對 commits 進行索引查(cha)找(zhao)來(lai)實現連接的。這可(ke)以yuan)EXPLAIN 的輸出看出來(lai)。

EXZ?��)?http://www.it165.net/pro/pkqt/QTEFJTiC1xMrks/Y=" src="http://www.it165.net/uploadfile/2018/1115/20181115060938442.png" style="height: 124px; width: 368px" />

  這兩(liang)個表中(zhong)的記(ji)錄比較多︰project_commits 有(you) 50 億行記(ji)錄,commits 有(you) 8.47 億行記(ji)錄。服務器(qi)的內存(cun)比較小,只有(you) 16GB。所以很可(ke)能是因為內存(cun)放(fang)不下那麼大的索引,需要(yao)讀取磁盤,因此sou)現賾跋xiang)到了(liao)性能。從 pmonitor 對臨時表的分(fen)析結果來(lai)看,這個查(cha)詢已(yi)經運行半(ban)天(tian)了(liao),還需要(yao) 373 個小時才能運行完。

  在我看來(lai),這個太過分(fen)了(liao),因為排序合(he)並連接(sort-merge join)所需的 I/O 時間(jian)應該要(yao)比預計的執行時間(jian)要(yao)低一(yi)個數量級。我在 dba.stackexchange.com 上(shang)尋(xun)求幫助,有(you)人給(gei)出了(liao)一(yi)些(xie)建議讓我嘗試,但(dan)我沒有(you)信心它(ta)們(men)能夠解決(jue)我的問(wen)題。我嘗試了(liao)第一(yi)個建議,結果並不樂觀。嘗試每(mei)個建議都(du)需要(yao)至少半(ban)天(tian)的時間(jian),後來(lai),我決(jue)定采(cai)用一(yi)種我認(ren)為可(ke)以有(you)效(xiao)解決(jue)這個問(wen)題的辦法(fa)。

  我將這兩(liang)個表導出到文件(jian)中(zhong),使用 Unix 的 join 命令(ling)將它(ta)們(men)連接在一(yi)起,將結果傳給(gei) uniq,把重復(fu)的行移除掉(diao),然後將結果導回到數據庫。導入過程(包括重建索引)從 20:41 開始,到第二天(tian)的 9:53 結束。以下是具體操作步驟。

  1. 將數據庫表導出為文本文件(jian)

  我先(xian)導出連接兩(liang)個表需要(yao)用到的字段,並按照連接字段進行排序。為了(liao)確保(bao)排序順序與 Unix 工具的排序順序兼(jian)容,我將字段轉換為字符類型。

  我將以下 SQL 查(cha)詢的輸出保(bao)存(cun)到文件(jian) commits_week.txt 中(zhong)。

 commits_week.txt

  然後將以下 SQL 查(cha)詢的輸出保(bao)存(cun)到 project_commits.txt 文件(jian)中(zhong)︰

 project_commits.txt

  這樣就生成了(liao)以下兩(liang)個文件(jian)。

  -rw-r–r– 1 dds dds 15G Aug 4 21:09 commits_week.txt

  -rw-r–r– 1 dds dds 93G Aug 5 00:36 project_commits.txt

  為了(liao)避免(mian)內存(cun)不足,我使用 –quick 選項來(lai)運行 mysql 客戶端,否則客戶端會在輸出結果之前(qian)嘗試收集(ji)所有(you)的記(ji)錄。

  2. 使用 Unix 命令(ling)行工具處理(li)文件(jian)

  接下來(lai),我使用 Unix 的 join 命令(ling)來(lai)連接這兩(liang)個文本文件(jian)。這個命令(ling)線性掃描兩(liang)個文件(jian),並將第一(yi)個字段相同(tong)的記(ji)錄組合(he)在一(yi)起。由于文件(jian)中(zhong)的記(ji)錄已(yi)經排好序,因此整個過程完成得很快,幾乎就是 I/O 的速度。我yi)菇  擁慕  gei) uniq,用以消除重復(fu)記(ji)錄,這就解決(jue)了(liao)原始查(cha)詢中(zhong)的 distinct 問(wen)題。同(tong)樣,在已(yi)經排好序的輸出結果上(shang),可(ke)以通過簡(jian)單(dan)的線性掃描完成去重。

  這是我運行的 Unix 命令(ling)。

  join commits_week.txt project_commits.txt uniq >joined_commits.txt

  經過一(yi)個小時的處理(li),我得到了(liao)想要(yao)的結果。

  -rw-r–r– 1 dds dds 133G Aug 5 01:40 joined_commits.txt

  3. 將文本文件(jian)導回數據庫

  最(zui)後,我將文本文件(jian)導回數據庫。

文本文件(jian)導回數據庫

  結語

  相信對MariaDB 有(you)所了(liao)解的朋友do知(zhi)道,在理(li)想狀態下,它(ta)是qiang)ke)以實現排序合(he)並連接的,而且yi)鼓茉讜?庠誦惺奔jian)可(ke)能過長的時候(hou)優(you)化器(qi)會運行讓排序合(he)並自動連接。今天(tian)給(gei)大家介紹的使用Unix 命令(ling)來(lai)提升MariaDB SQL的速度的介紹就到這里了(liao),希望能對有(you)需要(yao)的朋友有(you)所幫助。

Tag標簽︰MariaDB SQL  Unix命令(ling)  
  • 凤凰体彩官网

诚博国际官网About IT165 - 廣告服務 - 隱私聲明(ming) - 版權(quan)申明(ming) - 免(mian)責條款 - 網(wang)站地(di)圖 - 贵州福彩网官网網(wang)友投稿 - 聯系方式
本站內容來(lai)自于互聯網(wang),僅供用于網(wang)絡技術學習(xi),學習(xi)中(zhong)請遵(zun)循相關法(fa)律法(fa)規(gui)
凤凰体彩官网 | 下一页