mysql伺服器怎麼加速
① 濡備綍瑙e喅灞鍩熺綉鍐卪ysql鏁版嵁搴撹繛鎺ユ參_MySQL
閫氳繃鍐呯綉榪炲彟澶栦竴鍙版満鍣ㄧ殑mysql鏈嶅姟錛 紜鍙戠幇閫熷害N鎱錛 絳変簡澶х害鍑犲嶮縐掓墠絳夊埌鎻愮ず杈撳叆瀵嗙爜銆 浣嗘槸ping mysql鎵鍦ㄦ湇鍔″櫒鍗村緢蹇錛 鎯沖埌寰堜箙涔嬪墠鏈夎繃綾諱技鐨勭粡楠岋紝 telnet絳変竴浜涙湇鍔″湪榪炴帴璇鋒眰鐨勬椂鍊欙紝浼氬仛涓浜涘弽鍚戝煙鍚嶈В鏋愶紙濡傛灉鍙嶅悜瑙f瀽涓嶉『鐣咃紝 浼拌″氨浼氬歡榪熷緢澶氾紝 緇欎漢鐨勬劅瑙夋槸榪炴帴閫熷害N鎱錛侊級
鍦ㄧ綉涓婃悳緔浜嗕笅瑙e喅鍔炴硶錛 鍙戠幇鏈変袱縐嶏細
涓. 涓よ竟鏈哄櫒閰嶇疆鐨剅esolve.conf涓嶄竴鏍鳳紝 鎶妑esolve.conf閰嶇疆鎴愰熷害姣旇緝蹇鐨凞NS灝監K
浜. 鎶妋ysql閰嶇疆涓鐨凞NS鍙嶅悜瑙f瀽鍏蟲帀錛 涔烵K
鎴戠敤鐨勬槸絎涓縐嶅姙娉曪紝 淇鏀箁esolve.conf閰嶇疆鍚庯紝 閫熷害灝變笂鏉ヤ簡錛
闄勪竴錛 鎽樿嚜http://gcoder.blogbus.com/logs/31907502.html
涓ゅ彴鍦ㄥ悓涓緗戞電殑鏈哄櫒, 榪炴帴鍚屼竴涓鏁版嵁搴撴湇鍔″櫒, 涓鍙扮殑閫熷害鏄鍙︿竴鍙扮殑100鍊, 鏁版嵁搴撲富鏈烘槸鍩熷悕琛ㄧず鐨. 鎬庝箞閮芥兂涓嶆槑鐧?
鍚庢潵鏌ョ湅涓ゅ彴鏈哄櫒鐨 /etc/resolv.conf, 鍙戠幇閰嶇疆涓嶄竴鏍, 鏀規垚閫熷害蹇鐨勯偅鍙版満鍣ㄧ殑閰嶇疆, 閫熷害閭d笂灝變笂鏉ヤ簡.
鍩熷悕瑙f瀽涔熷彲浠ュ艱嚧緗戠粶紼嬪簭鎱, 鍙堜竴鏀惰幏. 鍙﹀, mysql榪樻湁DNS鍙嶅悜瑙f瀽鐨勯棶棰, 涔熷彲鑳藉艱嚧閫熷害鎱, 鍙浠ュ湪mysql鐨勯厤緗鏂囦歡涓, 鎶奃NS鍙嶅悜瑙f瀽鍏蟲帀.
闄勪簩錛 鎽樿嚜
褰撹繙紼嬭塊棶mysql鏃訛紝mysql浼氳В鏋愬煙鍚嶏紝浼氬艱嚧璁塊棶閫熷害寰堟參錛屽姞涓婁笅闈㈣繖涓閰嶇疆鍙瑙e喅姝ら棶棰
# 紱佹mysql鍋氬煙鍚嶈В鏋
[mysqld]
skip-name-resolve
php榪滅▼榪炴帴MYSQL閫熷害鎱,鏈夋椂榪滅▼榪炴帴鍒癕YSQL鐢ㄦ椂4-20縐掍笉絳,鏈鍦拌繛鎺MYSQL姝e父,鍑虹幇榪欑嶉棶棰樼殑涓昏佸師鍥犳槸,榛樿ゅ畨瑁呯殑MYSQL寮鍚浜咲NS鐨勫弽鍚戣В鏋,鍦∕Y.INI(WINDOWS緋葷粺涓)鎴朚Y.CNF(UNIX鎴朙INUX緋葷粺涓)鏂囦歡鐨刐mysqld]涓嬪姞鍏skip-name-resolve榪欎竴鍙ャ
浣嗘槸錛岃繖鏍蜂細寮曡搗涓涓闂棰橈細榪炴帴mysql鏃訛紝涓嶈兘浣跨敤 localhost榪炴帴浜嗭紝鑰屾槸瑕佷嬌鐢↖P鍦板潃鐨勶紱濡傛灉鏄鎸塴ocalhost瀵圭敤鎴瘋祴鏉冮檺鐨勮瘽錛岀敤鎴風櫥褰曟潈闄愪篃瑕佷慨鏀逛竴涓嬬殑銆
榪炴帴mysql閫熷害鎱㈢殑瑙e喅鏂規硶.
2鍙版湇鍔″櫒錛屼竴鍙拌窇iis+php錛屼竴鍙拌窇mysql錛屽拰浠ュ線涓鏍烽厤緗濂界幆澧冿紝嫻嬭瘯欏甸潰涓鍒嘜K
璺戝簲鐢ㄧ殑鏃跺欏彂鐜皃hp璁塊棶mysql閫熷害寰堟參錛岃繖縐嶆儏鍐靛湪浠ュ墠浠庢湭鍙戠幇榪囷紝鉶界劧2鍙版湇鍔″櫒騫墮潪鍦ㄥ悓涓緗戞典腑錛屼絾鏄痯ing鏁板煎熀鏈涓婇兘鍦1,2ms涔嬮棿錛宼cp榪炴帴搴旇ヤ笉鏄闂棰樺叧鍋ワ紝google浠ュ悗鎵懼埌絳旀堬紝鍦╩y.ini鏂囦歡鐨刐mysqld]閮ㄥ垎鍔犲叆:skip-name-resolve錛屼繚瀛樻枃浠訛紝閲嶅惎mysql錛屼竴鍒嘜K鍟︼紝閫熷害璞¢炰竴鏍蜂簡
鏂扮増鏈鐨刴ysql閰嶇疆璧鋒潵涓嶈薄浠ュ墠鐨勯偅涓鍌葷摐鍖栦簡錛岃繖涓闂棰樻姌鑵句簡鎴戜竴涓婂崍鐨勬椂闂達紝鏅氫笂鍥炴潵鎬葷畻鏄瑙e喅浜嗭紝鍢垮樋錛屽張瀛﹀埌涓浜涗笢瑗褲
Windows 2003涓嬬殑MySQL 5鏈嶅姟鍣錛屾湰鏈鴻繛鎺ュ埌MySQL鏈嶅姟闈炲父蹇錛屽矓鍩熺綉鍐呮湁涓ゅ彴Linux鏈哄櫒錛屾湁涓鍙拌繛鎺ュ緢蹇錛屽彟澶栦竴鍙拌緭鍏ュ瘑鐮佸悗瑕佺瓑濂藉嚑縐掗挓鎵嶈兘榪炰笂銆
瑙e喅鍔炴硶錛
鍦∕ySQL鏈嶅姟鍣ㄧ殑閰嶇疆涓澧炲姞涓涓濡備笅閰嶇疆鍚庨熷害椋炲揩銆
[mysqld]
skip-name-resolve
闄勫綍錛( How MySQL uses DNS )
When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the hostname cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.
If the operating system doesn't support the above thread-safe calls, the thread will lock a mutex and call gethostbyaddr() and gethostbyname() instead. Note that in this case no other thread can resolve other hostnames that is not in the hostname cache until the first thread is ready.
You can disable DNS host lookup by starting mysqld with --skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables.
If you have a very slow DNS and many hosts, you can get more performance by either disabling DNS lookop with --skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default: 128) and recompile mysqld.
You can disable the hostname cache with --skip-host-cache. You can clear the hostname cache with FLUSH HOSTS or mysqladmin flush-hosts.
If you don't want to allow connections over TCP/IP, you can do this by starting mysqld with --skip-networking.
PHP榪滅▼榪炴帴MYSQL閫熷害鎱,鏈夋椂榪滅▼榪炴帴鍒癕YSQL鐢ㄦ椂4-20縐掍笉絳,鏈鍦拌繛鎺MYSQL姝e父,鍑虹幇榪欑嶉棶棰樼殑涓昏佸師鍥犳槸,榛樿ゅ畨瑁呯殑MYSQL寮鍚浜咲NS鐨勫弽鍚戣В鏋,鍦∕Y.INI(WINDOWS緋葷粺涓)鎴朚Y.CNF(UNIX鎴朙INUX緋葷粺涓)鏂囦歡鐨刐mysqld]涓嬪姞鍏skip-name-resolve榪欎竴鍙ャ
MYSQL榪滅▼榪炴帴閫熷害鎱㈢殑瑙e喅鏂規硶
鍦ㄥ矓鍩熺綉鍐呰繛鎺ュ叾浠栨満鍣ㄧ殑MYSQL,鍙戠幇閫熷害鎱㈢殑寰,涓嶇煡閬撲粈涔堝師鍥,鎬繪湁鍑犵掔殑寤惰繜.
鍚庢潵鍦ㄧ綉涓婂彂鐜拌В鍐蟲柟娉,my.ini閲岄潰娣誨姞
[mysqld]
skip-name-resolve
skip-grant-tables
榪欐牱閫熷害灝卞揩浜!
skip-name-resolve
閫夐」灝辮兘紱佺敤DNS瑙f瀽錛岃繛鎺ラ熷害浼氬揩寰堝氥備笉榪囷紝榪欐牱鐨勮瘽灝變笉鑳藉湪MySQL鐨勬巿鏉冭〃涓浣跨敤涓繪満鍚嶄簡鑰屽彧鑳界敤ip鏍煎紡銆
鑻ヤ嬌鐢╛skip-grant-tables緋葷粺灝嗗逛換浣曠敤鎴風殑璁塊棶涓嶅仛浠諱綍璁塊棶鎺у埗錛屼絾鍙浠ョ敤 mysqladmin flush-privileges鎴杕ysqladmin reload鏉ュ紑鍚璁塊棶鎺у埗;榛樿ゆ儏鍐墊槸show databases璇鍙ュ規墍鏈夌敤鎴峰紑鏀撅紝濡傛灉mysql鏈嶅姟鍣ㄦ病鏈夊紑榪滅▼甯愭埛錛屽氨鍦╩y.ini閲岄潰鍔犱笂skip-grant-tables
② 關於MYSQL伺服器突然變慢的問題
MySQL 在崩潰恢復時,會遍歷打開所有 ibd 文件的 header page 驗證數據字典的准確性,如果 MySQL 中包含了大量表,這個校驗過程就會比較耗時。MySQL 下崩潰恢復確實和表數量有關,表總數越大,崩潰恢復時間越長。另外磁碟 IOPS 也會影響崩潰恢復時間,像這里開發庫的 HDD IOPS 較低,因此面對大量的表空間,校驗速度就非常緩慢。另外一個發現,MySQL 8 下正常啟用時居然也會進行表空間校驗,而故障恢復時則會額外再進行一次表空間校驗,等於校驗了 2 遍。不過 MySQL 8.0 里多了一個特性,即表數量超過 5W 時,會啟用多線程掃描,加快表空間校驗過程。
如何跳過校驗MySQL 5.7 下有方法可以跳過崩潰恢復時的表空間校驗過程嘛?查閱了資料,方法主要有兩種:
配置 innodb_force_recovery可以使 srv_force_recovery != 0,那麼 validate = false,即可以跳過表空間校驗。實際測試的時候設置 innodb_force_recovery =1,也就是強制恢復跳過壞頁,就可以跳過校驗,然後重啟就是正常啟動了。通過這種臨時方式可以避免崩潰恢復後非常耗時的表空間校驗過程,快速啟動 MySQL,個人目前暫時未發現有什麼隱患。
2. 使用共享表空間替代獨立表空間這樣就不需要打開 N 個 ibd 文件了,只需要打開一個 ibdata 文件即可,大大節省了校驗時間。自從聽了姜老師講過使用共享表空間替代獨立表空間解決 drop 大表時性能抖動的原理後,感覺共享表空間在很多業務環境下,反而更有優勢。
臨時冒出另外一種解決想法,即用 GDB 調試崩潰恢復,通過臨時修改 validate 變數值讓 MySQL 跳過表空間驗證過程,然後讓 MySQL 正常關閉,重新啟動就可以正常啟動了。但是實際測試發現,如果以 debug 模式運行,確實可以臨時修改 validate 變數,跳過表空間驗證過程,但是 debug 模式下代碼運行效率大打折扣,反而耗時更長。而以非 debug 模式運行,則無法修改 validate 變數,想法破滅。
③ MySQL資料庫伺服器逐漸變慢 該怎麼分析與解決
我們先來看第一個階段,MySQL慢的診斷思路,一般我們會從三個方向來做:
第一個方向是MySQL內部的觀測
第二個方向是外部資源的觀測
第三個方向是外部需求的改造
1.1 MySQL 內部觀測
我們來看MySQL內部的觀測,常用的觀測手段是這樣的,從上往下看,第一部分是Processlist,看一下哪個SQL壓力不太正常,第二步是explain,解釋一下它的執行計劃,第三步我們要做Profilling,如果這個SQL能再執行一次的話, 就做一個Profilling,然後高級的DBA會直接動用performance_schema ,MySQL 5.7 以後直接動用sys_schema,sys_schema是一個視圖,裡面有便捷的各類信息,幫助大家來診斷性能。再高級一點,我們會動用innodb_metrics進行一個對引擎的診斷。
除了這些手段以外,大家還提出了一些亂七八糟的手段,我就不列在這了,這些是常規的一個MySQL的內部的狀態觀測的思路。除了這些以外,MySQL還陸陸續續提供了一些暴露自己狀態的方案,但是這些方案並沒有在實踐中形成套路,原因是學習成本比較高。
1.2 外部資源觀測
外部資源觀測這部分,我引用了一篇文章,這篇文章的二維碼我貼在上面了。這篇文章是國外的一個神寫的,標題是:60秒的快速巡檢,我們來看一下它在60秒之內對伺服器到底做了一個什麼樣的巡檢。一共十條命令,這是前五條,我們一條一條來看。
1.uptime,uptime告訴我們這個機器活了多久,以及它的平均的負載是多少。
2.dmesg -T | tail,告訴我們系統日誌里邊有沒有什麼報錯。
3.vmstat 1,告訴我們虛擬內存的狀態,頁的換進換出有沒有問題,swap有沒有使用。
4. mpstat -P ALL,告訴我們CPU壓力在各個核上是不是均勻的。
5.pidstat 1,告訴我們各個進程的對資源的佔用大概是什麼樣子。
我們來看一下後五條:
首先是iostat-xz 1,查看IO的問題,然後是free-m內存使用率,之後兩個sar,按設備網卡設備的維度,看一下網路的消耗狀態,以及總體看TCP的使用率和錯誤率是多少。最後一條命令top,看一下大概的進程和線程的問題。
這個就是對於外部資源的診斷,這十條命令揭示了應該去診斷哪些外部資源。
1.3 外部需求改造
第三個診斷思路是外部的需求改造,我在這里引用了一篇文檔,這篇文檔是MySQL的官方文檔中的一章,這一章叫Examples of Common Queries,文檔中介紹了常規的SQL怎麼寫, 給出了一些例子。文章的鏈接二維碼在slide上。
我們來看一下它其中提到的一個例子。
它做的事情是從一個表裡邊去選取,這張表有三列,article、dealer、price,選取每個作者的最貴的商品列在結果集中,這是它的最原始的SQL,非常符合業務的寫法,但是它是個關聯子查詢。
關聯子查詢成本是很貴的,所以上面的文檔會教你快速地把它轉成一個非關聯子查詢,大家可以看到中間的子查詢和外邊的查詢之間是沒有關聯性的。
第三步,會教大家直接把子查詢拿掉,然後轉成這樣一個SQL,這個就叫業務改造,前後三個SQL的成本都不一樣,把關聯子查詢拆掉的成本,拆掉以後SQL會跑得非常好,但這個SQL已經不能良好表義了,只有在診斷到SQL成本比較高的情況下才建議大家使用這種方式。
為什麼它能夠把一個關聯子查詢拆掉呢?
這背後的原理是關系代數,所有的SQL都可以被表達成等價的關系代數式,關系代數式之間有等價關系,這個等價關系通過變換可以把關聯子查詢拆掉。
上面的這篇文檔是一個大學的教材,它從頭教了關於代數和SQL之間的關系。然後一步步推導怎麼去簡化這句SQL。
第一,MySQL本身提供了很多命令來觀察MySQL自身的各類狀態,大家從上往下檢一般能檢到SQL的問題或者伺服器的問題。
第二,從伺服器的角度,我們從巡檢的腳本角度入手,伺服器的資源就這幾種,觀測手法也就那麼幾種,我們把伺服器的資源全部都觀察一圈就可以了。
第三,如果實在搞不定,需求方一定要按照資料庫容易接受的方式去寫SQL,這個成本會下降的非常快,這個是常規的MySQL慢的診斷思路。