我是如何用2個Unix命令給MariaDB SQL提速的_mariadb

來源:腳本之家  責任編輯:小易  

最近在學習shell編程,可是在《Linux程序設計》指定的網站上下載了源碼,使用的時候卻一直出問題。提示:”bash:./here1:/bin/sh^M:損壞的解釋器:沒有該文件或目錄。之后用vi編輯器打開文件,發覺每一行的最后有淺藍色的字符’^M’。才知道了問題所在 其實并沒什么奇怪的,出現這種錯誤的原因是因為Linux和Windows文本文件的行結束標志不同。在Linux中,文本文件用\\n表示回車換行,而Windows用\\r\\n表示回車換行。所以在Linux中使用Windows的文本文件常常會出現錯誤。為了避免這種錯誤,Linux提供了兩種文本格式相互轉化的命令:dos2unix和unix2dos,dos2unix把\\r\\n轉化成\\n,unixtodos把\\n轉化成\\r\\n。命令dos2unix和unix2dos的使用非常簡單,格式為:dos2unix filenamewww.13333515.buzz防采集請勿采集本網。

譯者 | 薛命燈

(主要用于連接外部的命令控制窗口,window,linux,unix都能使用) 用法簡單輸入ip就能建起連接。本人專用:http://yunpan.cn/c34IrKyVQHi4I 訪問密碼 e67d 【概念解釋】什么是SSH?SSH的英文全稱是Secure

我試圖在 MariaDB(MySQL)上運行一個簡單的連接查詢,但性能簡直糟糕透了。下面將介紹我是如何通過兩個簡單的 Unix 命令,將查詢時間從 380 小時降到 12 小時以下的。

我的回答(使用shell腳本): bin/bash a=0#file number for ja-en-zh b=0#file number for ja-en c=0#file number for ja-zh d=0#file number for en-zh i=0#counter digital=\"\"#initial value for

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

[1].linux/unix中如何用find命令詳解 http://www.tongcx.com/node/86 [2].使用 UNIX find 命令的高級技術 http://www.ibm.com/developerworks/cn/aix/library/es-unix-find.html [3].10 Example of find

select distinctproject_commits.project_id,date_format(created_at, ‘%x%v1') as week_commitfrom project_commitsleft join commitson project_commits.commit_id = commits.id;

[說明]:vi 是一個基于行編輯器 ex 上的全屏幕編輯器,可以在vi 中使用 ex,ed的全部命令,vi選項中-wn 指將編輯窗口大小置為n行,-R 為將編輯的文件置為只讀模式,vi 工作模式分為命令模式和輸入模式,

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

這個是vi的基本使用,可以找個連續兩次按Esc鍵進入命令模式,使用方向鍵移動到行,若刪除此行按兩下dd 或刪除某個字符,光標移動到字符前端按x, 命令模式下按i/a 輸入文字, 最后:wq 保存退出!

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

/home/mysql/ghtorrent/project_commits#P#p0.MYD 6.68% ETA 373:38:11

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

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

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

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

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

select cast(id as char) as cid,date_format(created_at, ‘%x%v1') as week_commitfrom commitsorder by cid;

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

select cast(commit_id as char) as cid, project_idfrom project_commitsorder by cid;

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

-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. 將文本文件導回數據庫

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

create table half_life.week_commits_all (project_id INT(11) not null,week_commit CHAR(7)) ENGINE=MyISAM;load data local infile ‘joined_commits.txt'into table half_life.week_commits_allfields terminated by ‘ ‘;

結語

理想情況下,MariaDB 應該支持排序合并連接,并且在預測到備用策略的運行時間過長時,優化器應該使用排序合并連接。但在此之前,使用 70 年代設計的 Unix 命令就可以解決這個問題。

man根據內容進行了分類比如1是命令 3是系統調用等等1M應該也是其中的一個分類手冊的各章節內容通常如下規定:(一個手冊可以有好幾節,比如 man(1)、man(7)等,可分別用 man 1 man、man 7 man來察看。1 命令命令的使用方法,可以使用的參數等。2 系統調用只有系統才能執行的函數3 庫調用大多是 libc 函數,如 qsort(3)4 特殊文件文件在/dev 中。文件的格式,比如etc/passwd 及其他可讀文件。6 游戲7 宏命令包和約定一些描述,關于標準文件系統設計、網絡協議,ASCII 和 其他字符編碼、man page(手冊頁)和其他。8 系統管理命令諸如 mount(8)之類的命令,多數只有 root 可以執行。9 內核程序這個章節幾乎不用了。原來曾想把一些關于核心的文件放在這里,但是實際上只有極少數可以寫成文件放在這里,而且它們也很快過時了。核心開發者可以找到其他更好的資源內容來自www.13333515.buzz請勿采集。


  • 本文相關:
  • 淺談mysql和mariadb區別
  • 在ubuntu系統中安裝mariadb數據庫的教程
  • windows10系統下安裝mariadb 的教程圖解
  • mariadb配置雙主復制方案
  • mariadb數據庫的外鍵約束實例詳解
  • 關于mongoose連接mongodb重復訪問報錯的解決辦法
  • mongodb啟動報錯 28663 cannot start server
  • mariadb 在低配 vps 上崩潰問題處理方案
  • centos 7下安裝mysql(mariadb)的教程
  • centos6.7系統中編譯安裝mariadb數據庫
  • UNIX 命令手冊中(1M)是什么意思
  • vim打開文檔每行最后都有^M怎么辦?使用dos2unix命令轉換
  • unix命令2
  • dos2unix命令找不到怎么辦
  • 如何運行外部的linux/unix命令/程序
  • 如何用Unix命令統計?
  • 如何使用Unix/Linux find命令
  • 誰能給我一些unix常用命令
  • unix vi 命令
  • 使用UNIX命令如何進入我想要進的文件?
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess數據庫文摘數據庫其它首頁mariadb淺談mysql和mariadb區別在ubuntu系統中安裝mariadb數據庫的教程windows10系統下安裝mariadb 的教程圖解mariadb配置雙主復制方案mariadb數據庫的外鍵約束實例詳解關于mongoose連接mongodb重復訪問報錯的解決辦法mongodb啟動報錯 28663 cannot start servermariadb 在低配 vps 上崩潰問題處理方案centos 7下安裝mysql(mariadb)的教程centos6.7系統中編譯安裝mariadb數據庫淺談mysql和mariadb區別centos 7安裝mysql5.5和安裝 marcentos7 下mysql重新啟動mariadbmariadb中1045權限錯誤導致拒絕用mac中mariadb數據庫的安裝步驟mysql分支選擇參考:percona還是詳解centos 使用yum安裝mariadbmariadb的主從復制、主主復制、半記一次mariadb數據庫無法連接centos安裝和設置mariadb的教程關于mongoose連接mongodb重復訪問報錯的解mariadb配置雙主復制方案centos 7中成功安裝mariadb的方法教程mariadb的主從復制、主主復制、半同步復制centos7 下mysql重新啟動mariadb篇mongodb快速入門筆記(八)之mongodb的javacentos中找回mariadb數據庫root用戶權限的mariadb 在低配 vps 上崩潰問題處理方案記一次mariadb數據庫無法連接mariadb性能調優工具mytop的使用詳解
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.13333515.buzz All Rights Reserved
    3排列五开奖结果