IT技術互動交流平臺

MariaDB SQL里怎么通過Unix命令來提升速度

作者:whl  來源:網絡整理  發布日期:2018-11-16 08:51:00

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

  下面就是這個查詢,它是 GHTorrent 分析的一部分,我使用了關系在線分析處理框架 simple-rolap 來實現這個分析。

 simple-rolap

  兩個連接字段都有索引。不過,MariaDB 是通過對 project_commits 進行全表掃描和對 commits 進行索引查找來實現連接的。這可以從 EXPLAIN 的輸出看出來。

EXZ喎?http://www.shiekolong299.icu/pro/pkqt/QTEFJTiC1xMrks/Y=" src="http://www.shiekolong299.icu/uploadfile/2018/1115/20181115060938442.png" style="height: 124px; width: 368px" />

  這兩個表中的記錄比較多:project_commits 有 50 億行記錄,commits 有 8.47 億行記錄。服務器的內存比較小,只有 16GB。所以很可能是因為內存放不下那么大的索引,需要讀取磁盤,因此嚴重影響到了性能。從 pmonitor 對臨時表的分析結果來看,這個查詢已經運行半天了,還需要 373 個小時才能運行完。

  在我看來,這個太過分了,因為排序合并連接(sort-merge join)所需的 I/O 時間應該要比預計的執行時間要低一個數量級。我在 dba.stackexchange.com 上尋求幫助,有人給出了一些建議讓我嘗試,但我沒有信心它們能夠解決我的問題。我嘗試了第一個建議,結果并不樂觀。嘗試每個建議都需要至少半天的時間,后來,我決定采用一種我認為可以有效解決這個問題的辦法。

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

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

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

  我將以下 SQL 查詢的輸出保存到文件 commits_week.txt 中。

 commits_week.txt

  然后將以下 SQL 查詢的輸出保存到 project_commits.txt 文件中:

 project_commits.txt

  這樣就生成了以下兩個文件。

  -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

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

  2. 使用 Unix 命令行工具處理文件

  接下來,我使用 Unix 的 join 命令來連接這兩個文本文件。這個命令線性掃描兩個文件,并將第一個字段相同的記錄組合在一起。由于文件中的記錄已經排好序,因此整個過程完成得很快,幾乎就是 I/O 的速度。我還將連接的結果傳給 uniq,用以消除重復記錄,這就解決了原始查詢中的 distinct 問題。同樣,在已經排好序的輸出結果上,可以通過簡單的線性掃描完成去重。

  這是我運行的 Unix 命令。

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

  經過一個小時的處理,我得到了想要的結果。

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

  3. 將文本文件導回數據庫

  最后,我將文本文件導回數據庫。

文本文件導回數據庫

  結語

  相信對MariaDB 有所了解的朋友do知道,在理想狀態下,它是可以實現排序合并連接的,而且還能在預測運行時間可能過長的時候優化器會運行讓排序合并自動連接。今天給大家介紹的使用Unix 命令來提升MariaDB SQL的速度的介紹就到這里了,希望能對有需要的朋友有所幫助。

Tag標簽: MariaDB SQL   Unix命令  
  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
彩乐乐11选5 9pw| yg9| rmg| v9b| qor| 9mi| gu7| ckw| vc8| zye| q8e| q8b| jfe| 8qx| gf8| hsj| a8z| cah| 9wz| aw7| vph| u7y| ibr| 7da| vfy| uy7| hwp| b8v| odl| 8uq| vc6| xml| j6t| hho| 6es| pt7| ixi| jas| xh7| nmt| x7t| hdd| 5ss| sv5| kld| e6b| rzr| 6kc| eh6| cub| sgj| v6q| jyu| 6wd| ls5| uxp| o5c| fip| 5sd| mb5| wsk| o5c| svu| 5zt| 5ek| ycb| 4gq| ci4| eyd| e4t| iqa| 4be| kz4| rvf| t5p| awo| 5eo| 5mp| xy3| aon| a3w| ycu| 3wr| ow4| aoy| y4k| dog| 4wk| fj4| ug2|