mysql 101_MySQL 調優/優化的 101 個建議!

5b705707896e60e441175802ebc40f9e.png

原文:http://www.monitis.com/blog/101-tips-to-mysql-tuning-and-optimization/

MySQL是一個強大的開源數據庫。隨著MySQL上的應用越來越多,MySQL逐漸遇到了瓶頸。這里提供 101 條優化 MySQL 的建議。有些技巧適合特定的安裝環境,但是思路是相通的。我已經將它們分成了幾類以幫助你理解。

62470bc8d9ab800df24a0ceba0fa0de1.png

Mysql 監控

MySQL服務器硬件和OS(操作系統)調優:

1、有足夠的物理內存,能將整個InnoDB文件加載到內存里 —— 如果訪問的文件在內存里,而不是在磁盤上,InnoDB會快很多。

2、全力避免 Swap 操作 — 交換(swapping)是從磁盤讀取數據,所以會很慢。

3、使用電池供電的RAM(Battery-Backed RAM)。

4、使用一個高級磁盤陣列 — 最好是 RAID10 或者更高。

5、避免使用RAID5 — 和校驗需要確保完整性,開銷很高。

6、將你的操作系統和數據分開,不僅僅是邏輯上要分開,物理上也要分開 — 操作系統的讀寫開銷會影響數據庫的性能。

7、將臨時文件和復制日志與數據文件分開 — 后臺的寫操作影響數據庫從磁盤文件的讀寫操作。

8、更多的磁盤空間等于更高的速度。

9、磁盤速度越快越好。

10、SAS優于SATA。

11、小磁盤的速度比大磁盤的更快,尤其是在 RAID 中。

12、使用電池供電的緩存 RAID(Battery-Backed Cache RAID)控制器。

13、避免使用軟磁盤陣列。

14. 考慮使用固態IO卡(不是磁盤)來作為數據分區 — 幾乎對所有量級數據,這種卡能夠支持 2 GBps 的寫操作。

15、在 Linux 系統上,設置 swappiness 的值為0 — 沒有理由在數據庫服務器上緩存文件,這種方式在Web服務器或桌面應用中用的更多。

16、盡可能使用 noatime 和 nodirtime 來掛載文件系統 — 沒有必要為每次訪問來更新文件的修改時間。

17、使用 XFS 文件系統 — 一個比ext3更快的、更小的文件系統,擁有更多的日志選項,同時,MySQL在ext3上存在雙緩沖區的問題。

18、優化你的 XFS 文件系統日志和緩沖區參數 – -為了獲取最大的性能基準。

19、在Linux系統中,使用 NOOP 或 DEADLINE IO 調度器 — CFQ 和 ANTICIPATORY 調度器已經被證明比 NOOP 和 DEADLINE 慢。

20、使用 64 位操作系統 — 有更多的內存能用于尋址和 MySQL 使用。

21、將不用的包和后臺程序從服務器上刪除 — 減少資源占用。

22、將使用 MySQL 的 host 和 MySQL自身的 host 都配置在一個 host 文件中 — 這樣沒有 DNS 查找。

23、永遠不要強制殺死一個MySQL進程 — 你將損壞數據庫,并運行備份。

24、讓你的服務器只服務于MySQL — 后臺處理程序和其他服務會占用數據庫的 CPU 時間。

d3d3c571d8447fb30c4b6d7d6ddc670b.png

Mysql?配置

25、使用 innodb_flush_method=O_DIRECT 來避免寫的時候出現雙緩沖區。

26、避免使用 O_DIRECT 和 EXT3 文件系統 — 這會把所有寫入的東西序列化。

27、分配足夠 innodb_buffer_pool_size ,來將整個InnoDB 文件加載到內存 — 減少從磁盤上讀。

28、不要讓 innodb_log_file_size 太大,這樣能夠更快,也有更多的磁盤空間 — 經常刷新有利降低發生故障時的恢復時間。

29、不要同時使用 innodb_thread_concurrency 和 thread_concurrency 變量 — 這兩個值不能兼容。

30、為 max_connections 指定一個小的值 — 太多的連接將耗盡你的RAM,導致整個MySQL服務器被鎖定。

31、保持 thread_cache 在一個相對較高的數值,大約是 16 — 防止打開連接時候速度下降。

32、使用 skip-name-resolve — 移除 DNS 查找。

33、如果你的查詢重復率比較高,并且你的數據不是經常改變,請使用查詢緩存 — 但是,在經常改變的數據上使用查詢緩存會對性能有負面影響。

34、增加 temp_table_size — 防止磁盤寫。

35、增加 max_heap_table_size — 防止磁盤寫。

36、不要將 sort_buffer_size 的值設置的太高 — 可能導致連接很快耗盡所有內存。

37、監控 key_read_requests 和 key_reads,以便確定 key_buffer 的值 — key 的讀需求應該比 key_reads 的值更高,否則使用 key_buffer 就沒有效率了。

38、設置 innodb_flush_log_at_trx_commit = 0 可以提高性能,但是保持默認值(1)的話,能保證數據的完整性,也能保證復制不會滯后。

39、有一個測試環境,便于測試你的配置,可以經常重啟,不會影響生產環境。

96717539dcba1783440df8af02d1d087.png

Mysql Schema優化

40、保證你的數據庫的整潔性。

41、歸檔老數據 — 刪除查詢中檢索或返回的多余的行

42、在數據上加上索引。

43、不要過度使用索引,評估你的查詢。

44、壓縮 text 和 blob 數據類型 — 為了節省空間,減少從磁盤讀數據。

45、UTF 8 和 UTF16 比 latin1 慢。

46、有節制的使用觸發器。

47、保持數據最小量的冗余 — 不要復制沒必要的數據.

48、使用鏈接表,而不是擴展行。

49、注意你的數據類型,盡可能的使用最小的。

50、如果其他數據需要經常需要查詢,而 blob/text 不需要,則將 blob/text 數據域其他數據分離。

51、經常檢查和優化表。

52、經常做重寫 InnoDB 表的優化。

53、有時,增加列時,先刪除索引,之后在加上索引會更快。

54、為不同的需求選擇不同的存儲引擎。

55、日志表或審計表使用ARCHIVE存儲引擎 — 寫的效率更高。

56、將 session 數據存儲在 memcache 中,而不是 MySQL 中 — memcache 可以設置自動過期,防止MySQL對臨時數據高成本的讀寫操作。

57、如果字符串的長度是可變的,則使用VARCHAR代替CHAR — 節約空間,因為CHAR是固定長度,而VARCHAR不是(utf8 不受這個影響)。

58、逐步對 schema 做修改 — 一個小的變化將產生的巨大的影響。

59、在開發環境測試所有 schema 變動,而不是在生產環境的鏡像上去做。

60、不要隨意改變你的配置文件,這可能產生非常大的影響。

61、有時候,少量的配置會更好。

62、質疑使用通用的MySQL配置文件。

c752308746c8d066c206d3f1d036a927.png

700e2ab34c57bbb2361d59e2ecdc9b35.png

Mysql?查詢優化

63、使用慢查詢日志,找出執行慢的查詢。

64、使用 EXPLAIN 來決定查詢功能是否合適。

65、經常測試你的查詢,看是否需要做性能優化 — 性能可能會隨著時間的變化而變化。

66、避免在整個表上使用count(*) ,它可能會將整個表鎖住。

67、保持查詢一致,這樣后續類似的查詢就能使用查詢緩存了。

68、如果合適,用 GROUP BY 代替 DISTINCT。

69、在 WHERE、GROUP BY 和 ORDER BY 的列上加上索引。

70、保證索引簡單,不要在同一列上加多個索引。

71、有時,MySQL 會選擇錯誤的索引,這種情況使用 USE INDEX。

72、使用 SQL_MODE=STRICT 來檢查問題。

73、索引字段少于5個時,UNION 操作用 LIMIT,而不是 OR。

74、使用 INSERT ON DUPLICATE KEY 或 INSERT IGNORE 來代替 UPDATE,避免 UPDATE 前需要先 SELECT。

75、使用索引字段和 ORDER BY 來代替 MAX。

76、避免使用 ORDER BY RAND()。

77、LIMIT M,N 在特定場景下會降低查詢效率,有節制使用。

78、使用 UNION 來代替 WHERE 子句中的子查詢。

79、對 UPDATE 來說,使用 SHARE MODE 來防止排他鎖。

80、重啟 MySQL 時,記得預熱數據庫,確保將數據加載到內存,提高查詢效率。

81、使用 DROP TABLE ,然后再 CREATE TABLE ,而不是 DELETE FROM ,以刪除表中所有數據。

82、最小化你要查詢的數據,只獲取你需要的數據,通常來說不要使用 *。

83、考慮持久連接,而不是多次建立連接,已減少資源的消耗。

84、基準查詢,包括服務器的負載,有時一個簡單的查詢會影響其他的查詢。

85、當服務器的負載增加時,使用SHOW PROCESSLIST來查看慢的/有問題的查詢。

86、在存有生產環境數據副本的開發環境中,測試所有可疑的查詢。

ae5013d7c4e0586e6f145d3671cc2ff5.png

Mysql?備份過程

87、在二級復制服務器上進行備份。

88、備份過程中停止數據的復制,以防止出現數據依賴和外鍵約束的不一致。

89、徹底停止MySQL之后,再從數據文件進行備份。

90、如果使用MySQL dump進行備份,請同時備份二進制日志 — 確保復制過程不被中斷。

91、不要信任 LVM 快照的備份 — 可能會創建不一致的數據,將來會因此產生問題。

92、為每個表做一個備份,這樣更容易實現單表的恢復 — 如果數據與其他表是相互獨立的。

93、使用 mysqldump 時,指定 -opt 參數。

94、備份前檢測和優化表。

95、臨時禁用外鍵約束,來提高導入的速度。

96、臨時禁用唯一性檢查,來提高導入的速度。

97、每次備份完后,計算數據庫/表數據和索引的大小,監控其增長。

98、使用定時任務(cron)腳本,來監控從庫復制的錯誤和延遲。

99、定期備份數據。

100、定期測試備份的數據。

101、執行MySQL 監控: Monitis Unveils The World’s First Free On-demand MySQL Monitoring。

87fc745e0d324c50d854d89899bd7dc9.png

推薦閱讀

71d3f61c4ed63839a728409b6a076912.png

長按關注,更多精彩!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534629.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534629.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534629.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據安全:保護個人隱私和企業機密的關鍵

在當今數字化時代,數據已經成為了一種寶貴的資源。無論是個人還是企業,都離不開數據的支持。然而,隨著數據的不斷增長和廣泛應用,數據安全問題也日益突出。數據泄露、黑客攻擊、網絡詐騙等安全事件層出不窮,給個人和企…

python批量跑plsql_python實現自動化報表(Oracle/plsql/Excel/多線程)

# -*- coding: utf-8 -*-# Create time: 2019-10-16# Update time: 2019-11-28# Version: 1.0# Version: 2.0 增加多線程/出錯自動重新運行模塊# 導入模塊import cx_Oracleimport osimport pandas as pdimport pandas.io.sql as sqlimport timeimport openpyxlimport xlwings a…

mysql 配置郵件_SQL 郵件配置篇

exec sp_configure show advanced options,1RECONFIGURE WITHOVERRIDEgoexec sp_configure database mail xps,1RECONFIGURE WITHOVERRIDEgo--2.創建郵件帳戶信息EXECmsdb..Sysmail_add_account_spACCOUNT_NAME OCTMamiETL,--郵件帳戶名稱EMAIL_ADDRESS OCTMamiETL163.com,--發…

python 抽獎 配音樂_抖音上超好聽的神曲音樂,Python教你一次性下載

不知道什么時候開始,中國出現了南抖音、北快手的互文格局(東市買駿馬,西市買鞍韉…)。剛才提到了,之前比較喜歡刷抖音,對于我這種佛系程序猿,看網上這些整容妹子基本一個樣。喜歡抖音主要是兩個初衷,學做菜…

mysql批量寫入100萬數據_Mysql數據庫實踐操作之————批量插入數據(100萬級別的數據)-阿里云開發者社區...

第一種方法:使用insert into 插入從Redis每次獲取100條數據,根據條件去插入到Mysql數據庫中:條件:如果當前隊列中的值大于1000條,則會自動的條用該方法,該方法每次獲取從隊列的頭部每次獲取100掉數據插入到…

mysql多客戶端數據不同步_一種多終端設備上的數據同步方法

一種多終端設備上的數據同步方法【技術領域】[0001] 屬于移動通信技術領域,特別是涉及基于離網環境下多種移動終端設備之間的數 據同步的方法。 技術背景[0002] 90年代未,數據同步始于有線連接,如MAC機作為數據中心,與終端設備(iP…

oem監控mysql_OEM12c 安裝配置MySQL Plug-in用來監控MySQL

Plug-in--注冊信息[roottest agent]# /oem/emcli setup -urlhttps://omsdb.localdomain:7301/em -usernamesysmanOracle Enterprise Manager 12c 3.Copyright (c) 1996, 2013 Oracle Corporation and/or its affiliates. All rights reserved.The configuration directory &quo…

怎么利用迭代器寫入mysql_range()是什么?為什么不生產迭代器?

本篇文章給大家帶來的內容是關于range()是什么?為什么不生產迭代器?有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。迭代器是 23 種設計模式中最常用的一種(之一),在 Python 中隨處可見它的身影&#x…

java 流式_Java開發筆記(七十二)Java8新增的流式處理

通過前面幾篇文章的學習,大家應能掌握幾種容器類型的常見用法,對于簡單的增刪改和遍歷操作,各容器實例都提供了相應的處理方法,對于實際開發中頻繁使用的清單List,還能利用Arrays工具的asList方法給清單對象做初始化賦…

java保留二位小數_java使double保留兩位小數的多方法 java保留兩位小數

復制代碼代碼如下:mport java.text.DecimalFormat;DecimalFormat df new DecimalFormat("######0.00");double d1 3.23456double d2 0.0;double d3 2.0;df.format(d1);df.format(d2);df.format(d3);3個結果分別為:復制代碼代碼如下:3.230.002.00java保留兩位…

linux java jar打包_【Java】Java程序打包成jar包在Linux上運行

當需要把在Windows上開發的Java程序用在Linux上運行時,就需要吧該Java程序打包成jar包上傳到Linux上去運行。1.Java程序用MyEclipse打包成可運行的jar包(1)在MyEclipse中選中需要打包的項目,點擊右鍵,選擇:Export... 如下圖所示&a…

java匿名對象 回收_Java 匿名對象

我們知道一般實例化一個對象的格式,如下:Car car new Car();其中,變量名 car 就是 new Car() 這個對象的名字。car 是引用類型的變量,它的值存放的是對象的引用(或地址),通過 car 這個變量我們就可以間接使用對象。那…

java int 正則表達式_java正則表達式

Java正則表達式正則表達式定義了字符串的模式。正則表達式可以用來搜索、編輯或處理文本。正則表達式并不僅限于某一種語言,但是在每種語言中有細微的差別。Java正則表達式和Perl的是最為相似的。java.util.regex包主要包括以下三個類:Pattern類&#xf…

mysql.h 動態編譯命令_Linux環境編譯動態庫和靜態庫總結

對Linux環境動態庫和靜態庫的一些基礎知識做一些總結,首先總結靜態庫的編譯步驟。1 先基于.cpp或者.c文件生成對應的.o文件2將幾個.o文件 使用ar -cr命令 生成libname.a文件libname.a 為靜態庫, name 為靜態庫的名字,可以根據模塊功能命名。舉…

netbeans java中文_Ubuntu?下jdk安裝中文字體?java?解決netbeans?方塊字?中文亂碼

安裝環境Ubuntu 11.04、javajdk1.6.0_27首先找到你需要的字體,比如我就是從windows系統里拷出來的,C:\WINDOWS\Fonts這里有很多字體,我只拷貝了simsun.ttc(中文 宋體,從xp系統拷貝的,win7 下沒有這個文件)安裝java后&a…

python 教學_「Python基礎」一次就裝好Python手把手裝到好

一、前言:安裝Python有兩個主要的方法,視情況而定我兩個都會用:(1)安裝 AnacondaAnaconda像一個懶人包,安裝它等于把Python安裝好連同把Python大部分的套件也下載好了,不只如此連通較常用的Python IDE一同幫你裝到好。…

java求二維數組每行的最大值_用JAVA輸入一個二維數組a[3][4]的元素值,求輸出其元素最大值...

展開全部這個簡單啊,把所有元素遍歷一邊62616964757a686964616fe58685e5aeb931333335343963代碼:import java.util.Scanner;public class Help2 {public static void main(String[] args) {Scanner inputnew Scanner(System.in);System.out.print("…

java redis 面試題_Java開發人員怎么面試 常見Redis面試題有哪些

Java開發人員怎么面試?常見Redis面試題有哪些?Redis是目前各大企業都在使用的人們技術,也是企業選拔人才時考核的一個難題。有很多同學只是簡單了解Redis的應用,但對于為什么要用Redis以及企業面試中有關Redis的問題卻答不上來。接…

java方法重載實事例_零基礎java入門教程函數重載function實例化格式案例

java函數的重載,說白了就是函數塊函數名一樣,但函數類型和參數類型和參數列表個數不同重載之和參數列表有關系,與返回值無關java函數重載函數重載鋪墊如下圖函數重載鋪墊上圖功能顯示,功能一致所以功能一致所以用的功能函數名一致…

java 類 屬性數量_跟我學java編程—Java類的屬性與成員變量

在定義類時,經常需要抽象出它的屬性,并定義在類的主體中。下面就來介紹與屬性相關的內容。常量屬性在類中定義的屬性有常量屬性和成員屬性之分。常量屬性用final關鍵字修飾,常量只能賦值一次,在程序中不能修改它的值。一般來說&am…