本文目錄一覽:
- 1、求《MySQL管理之道性能調優高可用與監控第2版》全文免費下載百度網盤資源,謝謝~
- 2、《高性能MySQL第3版》pdf下載在線閱讀,求百度網盤雲資源
- 3、《深入淺出MySQL資料庫開發優化與管理維護第3版》pdf下載在線閱讀全文,求百度網盤雲資源
- 4、mysql最好的優化技巧
- 5、《MySQL性能調優與架構設計》epub下載在線閱讀,求百度網盤雲資源
- 6、MySQL性能調優 – 你必須了解的15個重要變數
求《MySQL管理之道性能調優高可用與監控第2版》全文免費下載百度網盤資源,謝謝~
《MySQL管理之道性能調優高可用與監控第2版》百度網盤pdf最新全集下載:
鏈接:
?pwd=k5aq 提取碼: k5aq
簡介:本書首先介紹了MySQL5.7和MariaDB10.1版本的新特性,然後以構建高性能MySQL伺服器為核心,從故障診斷與優化、性能調優、備份與恢復、高可用集群架構搭建與管理、讀寫分離和分散式DB架構搭建與管理、性能和服務監控等方面多角度深入講解了如何去管理與維護MySQL伺服器。書中內容以實戰為導向,所有內容均來自於筆者多年實踐經驗的總結和新知識的拓展,同時也針對運維人員、DBA等相關工作者會遇到的有代表性的疑難問題給出了實用的情景模擬,並給出了解決方案。不論你目前有沒有遇到過此類問題,相信對你以後處理相關問題都會有所借鑒。本書適合所有希望構建和管理高性能、高可用性的MySQL資料庫系統的開發者和DBA閱讀。
《高性能MySQL第3版》pdf下載在線閱讀,求百度網盤雲資源
《高性能MySQL(第3版)》(施瓦茨 (Baron Schwartz))電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:
提取碼:enz6
書名:高性能MySQL(第3版)
作者:施瓦茨 (Baron Schwartz)
譯者:寧海元
豆瓣評分:9.3
出版社:電子工業出版社
出版年份:2013-5-1
頁數:764
內容簡介:
《高性能mysql(第3版)》是mysql 領域的經典之作,擁有廣泛的影響力。第3 版更新了大量的內容,不但涵蓋了最新mysql 5.5版本的新特性,也講述了關於固態盤、高可擴展性設計和雲計算環境下的資料庫相關的新內容,原有的基準測試和性能優化部分也做了大量的擴展和補充。全書共分為16 章和6 個附錄,內容涵蓋mysql 架構和歷史,基準測試和性能剖析,資料庫軟硬體性能優化,複製、備份和恢復,高可用與高可擴展性,以及雲端的mysql 和mysql相關工具等方面的內容。每一章都是相對獨立的主題,讀者可以有選擇性地單獨閱讀。
《高性能mysql(第3版)》不但適合資料庫管理員(dba)閱讀,也適合開發人員參考學習。不管是資料庫新手還是專家,相信都能從本書有所收穫。
作者簡介:
關於作者
Baron Schwartz 是一位軟體工程師,居住在弗吉尼亞州的Charlottesville,網路常用名是Xaprb,這是按照QWERTY 鍵盤的順序在Dvorak 鍵盤上打出來的名字。在不忙於解決有趣的編程挑戰時,Baron 會和他的妻子Lynn 以及小狗Carbon 一起享受閑暇的時光。他有一個軟體工程方面的博客,地址是
Peter Zaitsev 曾經是MySQL AB 公司高性能組的經理,目前在運作mysqlperformance
blog.com 網站。他擅長於幫助那些每天有數以百萬計訪問量的網站的管理員解決問題,這些網站通常需要幾百台機器來處理TB 級的數據。他常常為了解決一個問題而不停地升級硬體和軟體(比如查詢優化)。Peter 還經常在各種會議上演講。
Vadim Tkachenko 曾經是MySQL AB 公司的性能工程師。作為一名在多線程編程和同步方面的專家,他的主要工作是基準測試、性能剖析,以及找出系統的性能瓶頸。他還在性能監控和調優方面做了一些工作,使得MySQL 在多核機器上有更好的可擴展性。
================================================================
譯者簡介
寧海元 有超過十年的資料庫管理經驗,從最初到SQL Server 2000到Oracle到MySQL,擅長資料庫高可用架構,性能優化和故障診斷。2007年加入淘寶,帶領淘寶DBA團隊支撐了淘寶業務的快速增長,完成了資料庫的垂直拆分、水平拆分,遷移到MySQL體系等主要工作。目前專註於無線數據領域。網路常用名NinGoo,個人博客:
周振興 畢業於北京師範大學數學系,09年加入淘寶資料庫團隊負責MySQL運維管理工作,有豐富的MySQL性能優化、Troubleshooting經驗,對MySQL主要模塊的實現和原理有深入的研究,經歷淘寶MySQL實例從30到3000的發展,對系統架構、高可用環境規劃都有深入理解。個人博客:
彭立勛 2010年大學畢業後加入阿里巴巴運維部。作為一名MySQL DBA,在運維MySQL的過程中,對MySQL和InnoDB的一些功能和缺陷就進行了補充,編寫了多主複製和數據閃回等補丁。目前在阿里集團核心系統研發部資料庫組,專註於MySQL資料庫相關的開發工作。後來一些補丁被MySQL之父Mony看中,成為MariaDB提交組(Maria-captains)成員,並且把多主複製,線程內存監控等補丁合併到了MariaDB 10.0版本。
翟衛祥 畢業於武漢大學,研究生階段從事資料庫相關研究。畢業後就職於阿里巴巴集團資料庫技術團隊至今,主要負責阿里內部MySQL代碼分支維護,包括MySQL Bug Fix及新特性開發。對MySQL內核有一定的研究。
劉輝 2008年畢業於西安電子科技大學計算機系,碩士學位。2011年加入阿里巴巴集團資料庫技術團隊,花名希羽,MySQL內核開發工程師。
《深入淺出MySQL資料庫開發優化與管理維護第3版》pdf下載在線閱讀全文,求百度網盤雲資源
《深入淺出MySQL資料庫開發優化與管理維護第3版》百度網盤pdf最新全集下載:
鏈接:
?pwd=grx5 提取碼:grx5
簡介:《深入淺出MySQL:資料庫開發、優化與管理維護(第3版)》源自網易公司多位資深資料庫專家數年的經驗總結和MySQL資料庫的使用心得,在之前版本的基礎之上,基於MySQL 5.7版本進行了內容升級,同時也對MySQL 8.0的重要功能進行了介紹。除了對原有內容的更新之外,本書還新增了作者在高可用架構、資料庫自動化運維,以及資料庫中間件方面的實踐和積累。
《深入淺出MySQL:資料庫開發、優化與管理維護(第3版)》分為「基礎篇」「開發篇」「優化篇」「管理維護篇」和「架構篇」5個部分,共32章。基礎篇面向MySQL的初學者,介紹了MySQL的安裝與配置、SQL基礎、MySQL支持的數據類型、MySQL中的運算符、常用函數等內容。開發篇面向的是MySQL設計和開發人員,內容涵蓋了表類型(存儲引擎)的選擇、選擇合適的數據類型、字符集、索引的設計和使用、開發常用資料庫對象、事務控制和鎖定語句、SQL中的安全問題、SQL Mode及相關問題、MySQL分區等。優化篇針對的是開發人員和資料庫管理人員,內容包括SQL優化、鎖問題、優化MySQL Server、磁碟I/O問題、應用優化、PS/SYS資料庫、故障診斷等內容。管理維護篇適合資料庫管理員閱讀,介紹了MySQL高級安裝和升級、MySQL中的常用工具、MySQL日誌、備份與恢復、MySQL許可權與安全、MySQL監控、MySQL常見問題和應用技巧、自動化運維繫統的開發等內容。架構篇主要面向高級資料庫管理人員和資料庫架構設計師,內容包括MySQL複製、高可用架構、MySQL中間件等內容。
mysql最好的優化技巧
1、選取最適用的欄位屬性
MySQL 可以很好的支持大數據量的存取,但是一般說來,資料庫中的表越小,在它上面執行的查詢也就會越快。因此,在創建表的時候,為了獲得更好的性能,我們可以將表中欄位的寬度設得儘可能小。例如,在定義郵政編碼這個欄位時,如果將其設置為CHAR(255),顯然給資料庫增加了不必要的空間,甚至使用VARCHAR這種類型也是多餘的,因為CHAR(6)就可以很好的完成任務了。同樣的,如果可以的話,我們應該使用MEDIUMINT而不是BIGIN來定義整型欄位。
另外一個提高效率的方法是在可能的情況下,應該盡量把欄位設置為NOT NULL,這樣在將來執行查詢的時候,資料庫不用去比較NULL值。
對於某些文本欄位,例如「省份」或者「性別」,我們可以將它們定義為ENUM類型。因為在MySQL中,ENUM類型被當作數值型數據來處理,而數值型數據被處理起來的速度要比文本類型快得多。這樣,我們又可以提高資料庫的性能。
2、使用連接(JOIN)來代替子查詢(Sub-Queries)
MySQL 從4.1開始支持SQL的子查詢。這個技術可以使用SELECT語句來創建一個單列的查詢結果,然後把這個結果作為過濾條件用在另一個查詢中。例如,我們要將客戶基本信息表中沒有任何訂單的客戶刪除掉,就可以利用子查詢先從銷售信息表中將所有發出訂單的客戶ID取出來,然後將結果傳遞給主查詢,如下所示:
DELETE FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死,並且寫起來也很容易。但是,有些情況下,子查詢可以被更有效率的連接(JOIN).. 替代。例如,假設我們要將所有沒有訂單記錄的用戶取出來,可以用下面這個查詢完成:
SELECT * FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
如果使用連接(JOIN).. 來完成這個查詢工作,速度將會快很多。尤其是當salesinfo表中對CustomerID建有索引的話,性能將會更好,查詢如下:
SELECT * FROM customerinfo
LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo.
CustomerID
WHERE salesinfo.CustomerID IS NULL
連接(JOIN).. 之所以更有效率一些,是因為 MySQL不需要在內存中創建臨時表來完成這個邏輯上的需要兩個步驟的查詢工作。
3、使用聯合(UNION)來代替手動創建的臨時表
MySQL 從 4.0 的版本開始支持 UNION 查詢,它可以把需要使用臨時表的兩條或更多的 SELECT 查詢合併的一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證資料庫整齊、高效。使用 UNION 來創建查詢的時候,我們只需要用 UNION作為關鍵字把多個 SELECT 語句連接起來就可以了,要注意的是所有 SELECT 語句中的欄位數目要想同。下面的例子就演示了一個使用 UNION的查詢。
SELECT Name, Phone FROM client
UNION
SELECT Name, BirthDate FROM author
UNION
SELECT Name, Supplier FROM product
4、事務
儘管我們可以使用子查詢(Sub-Queries)、連接(JOIN)和聯合(UNION)來創建各種各樣的查詢,但不是所有的資料庫操作都可以只用一條或少數幾條SQL語句就可以完成的。更多的時候是需要用到一系列的語句來完成某種工作。但是在這種情況下,當這個語句塊中的某一條語句運行出錯的時候,整個語句塊的操作就會變得不確定起來。設想一下,要把某個數據同時插入兩個相關聯的表中,可能會出現這樣的情況:第一個表中成功更新後,資料庫突然出現意外狀況,造成第二個表中的操作沒有完成,這樣,就會造成數據的不完整,甚至會破壞資料庫中的數據。要避免這種情況,就應該使用事務,它的作用是:要麼語句塊中每條語句都操作成功,要麼都失敗。換句話說,就是可以保持資料庫中數據的一致性和完整性。事物以BEGIN 關鍵字開始,COMMIT關鍵字結束。在這之間的一條SQL操作失敗,那麼,ROLLBACK命令就可以把資料庫恢復到BEGIN開始之前的狀態。
BEGIN;
INSERT INTO salesinfo SET CustomerID=14;
UPDATE inventory SET Quantity=11
WHERE item=’book’;
COMMIT;
事務的另一個重要作用是當多個用戶同時使用相同的數據源時,它可以利用鎖定資料庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所干擾。
5、鎖定表
儘管事務是維護資料庫完整性的一個非常好的方法,但卻因為它的獨佔性,有時會影響資料庫的性能,尤其是在很大的應用系統中。由於在事務執行的過程中,資料庫將會被鎖定,因此其它的用戶請求只能暫時等待直到該事務結束。如果一個資料庫系統只有少數幾個用戶
來使用,事務造成的影響不會成為一個太大的問題;但假設有成千上萬的用戶同時訪問一個資料庫系統,例如訪問一個電子商務網站,就會產生比較嚴重的響應延遲。
其實,有些情況下我們可以通過鎖定表的方法來獲得更好的性能。下面的例子就用鎖定表的方法來完成前面一個例子中事務的功能。
LOCK TABLE inventory WRITE
SELECT Quantity FROM inventory
WHEREItem=’book’;
…
UPDATE inventory SET Quantity=11
WHEREItem=’book’;
UNLOCK TABLES
這裡,我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作。
6、使用外鍵
鎖定表的方法可以維護數據的完整性,但是它卻不能保證數據的關聯性。這個時候我們就可以使用外鍵。例如,外鍵可以保證每一條銷售記錄都指向某一個存在的客戶。在這裡,外鍵可以把customerinfo 表中的CustomerID映射到salesinfo表中CustomerID,任何一條沒有合法CustomerID的記錄都不會被更新或插入到 salesinfo中。
CREATE TABLE customerinfo
(
CustomerID INT NOT NULL ,
PRIMARY KEY ( CustomerID )
) TYPE = INNODB;
CREATE TABLE salesinfo
(
SalesID INT NOT NULL,
CustomerID INT NOT NULL,
PRIMARY KEY(CustomerID, SalesID),
FOREIGN KEY (CustomerID) REFERENCES customerinfo
(CustomerID) ON DELETECASCADE
) TYPE = INNODB;
注意例子中的參數「ON DELETE CASCADE」。該參數保證當 customerinfo 表中的一條客戶記錄被刪除的時候,salesinfo 表中所有與該客戶相關的記錄也會被自動刪除。如果要在 MySQL 中使用外鍵,一定要記住在創建表的時候將表的類型定義為事務安全表 InnoDB類型。該類型不是 MySQL 表的默認類型。定義的方法是在 CREATE TABLE 語句中加上 TYPE=INNODB。如例中所示。
7、使用索引
索引是提高資料庫性能的常用方法,它可以令資料庫伺服器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含有MAX(), MIN()和ORDERBY這些命令的時候,性能提高更為明顯。那該對哪些欄位建立索引呢?一般說來,索引應建立在那些將用於JOIN, WHERE判斷和ORDER BY排序的欄位上。盡量不要對資料庫中某個含有大量重複的值的欄位建立索引。對於一個ENUM類型的欄位來說,出現大量重複值是很有可能的情況,例如 customerinfo中的「province」.. 欄位,在這樣的欄位上建立索引將不會有什麼幫助;相反,還有可能降低資料庫的性能。我們在創建表的時候可以同時創建合適的索引,也可以使用ALTER TABLE或CREATE INDEX在以後創建索引。此外,MySQL
從版本3.23.23開始支持全文索引和搜索。全文索引在 MySQL 中是一個FULLTEXT類型索引,但僅能用於MyISAM 類型的表。對於一個大的資料庫,將數據裝載到一個沒有FULLTEXT索引的表中,然後再使用ALTER TABLE或CREATE INDEX創建索引,將是非常快的。但如果將數據裝載到一個已經有FULLTEXT索引的表中,執行過程將會非常慢。
8、優化的查詢語句
絕大多數情況下,使用索引可以提高查詢的速度,但如果SQL語句使用不恰當的話,索引將無法發揮它應有的作用。下面是應該注意的幾個方面。首先,最好是在相同類型的欄位間進行比較的操作。在MySQL 3.23版之前,這甚至是一個必須的條件。例如不能將一個建有索引的INT欄位和BIGINT欄位進行比較;但是作為特殊的情況,在CHAR類型的欄位和 VARCHAR類型欄位的欄位大小相同的時候,可以將它們進行比較。其次,在建有索引的欄位上盡量不要使用函數進行操作。
例如,在一個DATE類型的欄位上使用YEAE()函數時,將會使索引不能發揮應有的作用。所以,下面的兩個查詢雖然返回的結果一樣,但後者要比前者快得多。
SELECT * FROM order WHERE YEAR(OrderDate)2001;
SELECT * FROM order WHERE OrderDate”2001-01-01″;
同樣的情形也會發生在對數值型欄位進行計算的時候:
SELECT * FROM inventory WHERE Amount/724;
SELECT * FROM inventory WHERE Amount24*7;
上面的兩個查詢也是返回相同的結果,但後面的查詢將比前面的一個快很多。第三,在搜索字元型欄位時,我們有時會使用 LIKE 關鍵字和通配符,這種做法雖然簡單,但卻也是以犧牲系統性能為代價的。例如下面的查詢將會比較表中的每一條記錄。
SELECT * FROM books
WHERE name like “MySQL%”
但是如果換用下面的查詢,返回的結果一樣,但速度就要快上很多:
SELECT * FROM books
WHERE name=”MySQL”and name”MySQM”
最後,應該注意避免在查詢中讓MySQL進行自動類型轉換,因為轉換過程也會使索引變得不起作用。
《MySQL性能調優與架構設計》epub下載在線閱讀,求百度網盤雲資源
《MySQL性能調優與架構設計》(簡朝陽)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:
提取碼:1aeg
書名:MySQL性能調優與架構設計
作者:簡朝陽
豆瓣評分:8.1
出版年份:2009-6
頁數:392
內容簡介:《MySQL性能調優與架構設計》以 MySQL 資料庫的基礎及維護為切入點,重點介紹了 MySQL 資料庫應用系統的性能調優,以及高可用可擴展的架構設計。
全書共分3篇,基礎篇介紹了MySQL軟體的基礎知識、架構組成、存儲引擎、安全管理及基本的備份恢復知識。性能優化篇從影響 MySQL 資料庫應用系統性能的因素開始,針對性地對各個影響因素進行調優分析。如 MySQL Schema 設計的技巧,Query 語句的性能優化方式方法及MySQL Server中SQL層和存儲引擎層的優化思路。同時還分析了 MySQL 資料庫中主要存儲引擎的鎖定機制。架構設計篇則主要以設計一個高可用可擴展的分散式企業級資料庫集群環境為目標,分析介紹了通過 MySQL 實現這一目標的多種架構方式。主要包括可擴展和高可用兩部分內容,可擴展部分包括設計原則、Replication 的利用、數據切分、如何使用 Cache 和 Search,以及 NDB Cluster等內容。高可用則主要包括 Dual Master、DRBD、NDB Cluster,以及系統監控等方面。
本書主要面向有一定的 MySQL 基礎或至少有一定SQL語言基礎的讀者朋友。
MySQL性能調優 – 你必須了解的15個重要變數
前言:
MYSQL 應該是最流行了 WEB 後端資料庫。雖然 NOSQL 最近越來越多的被提到,但是相信大部分架構師還是會選擇 MYSQL 來做數據存儲。本文作者總結梳理MySQL性能調優的15個重要變數,又不足需要補充的還望大佬指出。
1.DEFAULT_STORAGE_ENGINE
如果你已經在用MySQL 5.6或者5.7,並且你的數據表都是InnoDB,那麼表示你已經設置好了。如果沒有,確保把你的錶轉換為InnoDB並且設置default_storage_engine為InnoDB。
為什麼?簡而言之,因為InnoDB是MySQL(包括Percona Server和MariaDB)最好的存儲引擎 – 它支持事務,高並發,有著非常好的性能表現(當配置正確時)。這裡有詳細的版本介紹為什麼
2.INNODB_BUFFER_POOL_SIZE
這個是InnoDB最重要變數。實際上,如果你的主要存儲引擎是InnoDB,那麼對於你,這個變數對於MySQL是最重要的。
基本上,innodb_buffer_pool_size指定了MySQL應該分配給InnoDB緩衝池多少內存,InnoDB緩衝池用來存儲緩存的數據,二級索引,臟數據(已經被更改但沒有刷新到硬碟的數據)以及各種內部結構如自適應哈希索引。
根據經驗,在一個獨立的MySQL伺服器應該分配給MySQL整個機器總內存的80%。如果你的MySQL運行在一個共享伺服器,或者你想知道InnoDB緩衝池大小是否正確設置,詳細請看這裡。
3.INNODB_LOG_FILE_SIZE
InnoDB重做日誌文件的設置在MySQL社區也叫做事務日誌。直到MySQL 5.6.8事務日誌默認值innodb_log_file_size=5M是唯一最大的InnoDB性能殺手。從MySQL 5.6.8開始,默認值提升到48M,但對於許多稍繁忙的系統,還遠遠要低。
根據經驗,你應該設置的日誌大小能在你伺服器繁忙時能存儲1-2小時的寫入量。如果不想這麼麻煩,那麼設置1-2G的大小會讓你的性能有一個不錯的表現。這個變數也相當重要,更詳細的介紹請看這裡。
當然,如果你有大量的大事務更改,那麼,更改比默認innodb日誌緩衝大小更大的值會對你的性能有一定的提高,但是你使用的是autocommit,或者你的事務更改小於幾k,那還是保持默認的值吧。
4.INNODB_FLUSH_LOG_AT_TRX_COMMIT
默認下,innodb_flush_log_at_trx_commit設置為1表示InnoDB在每次事務提交後立即刷新同步數據到硬碟。如果你使用autocommit,那麼你的每一個INSERT, UPDATE或DELETE語句都是一個事務提交。
同步是一個昂貴的操作(特別是當你沒有寫回緩存時),因為它涉及對硬碟的實際同步物理寫入。所以如果可能,並不建議使用默認值。
兩個可選的值是0和2:
* 0表示刷新到硬碟,但不同步(提交事務時沒有實際的IO操作)
* 2表示不刷新和不同步(也沒有實際的IO操作)
所以你如果設置它為0或2,則同步操作每秒執行一次。所以明顯的缺點是你可能會丟失上一秒的提交數據。具體來說,你的事務已經提交了,但伺服器馬上斷電了,那麼你的提交相當於沒有發生過。
顯示的,對於金融機構,如銀行,這是無法忍受的。不過對於大多數網站,可以設置為innodb_flush_log_at_trx_commit=0|2,即使伺服器最終崩潰也沒有什麼大問題。畢竟,僅僅在幾年前有許多網站還是用MyISAM,當崩潰時會丟失30s的數據(更不要提那令人抓狂的慢修復進程)。
那麼,0和2之間的實際區別是什麼?性能明顯的差異是可以忽略不計,因為刷新到操作系統緩存的操作是非常快的。所以很明顯應該設置為0,萬一MySQL崩潰(不是整個機器),你不會丟失任何數據,因為數據已經在OS緩存,最終還是會同步到硬碟的。
5.SYNC_BINLOG
已經有大量的文檔寫到sync_binlog,以及它和innodb_flush_log_at_trx_commit的關係,下面我們來簡單的介紹下:
a) 如果你的伺服器沒有設置從伺服器,而且你不做備份,那麼設置sync_binlog=0將對性能有好處。
b) 如果你有從伺服器並且做備份,但你不介意當主伺服器崩潰時在二進位日誌丟失一些事件,那麼為了更好的性能還是設置為sync_binlog=0.
c) 如果你有從伺服器並且備份,你非常在意從伺服器的一致性,以及能及時恢復到一個時間點(通過使用最新的一致性備份和二進位日誌將資料庫恢復到特定時間點的能力),那麼你應該設置innodb_flush_log_at_trx_commit=1,並且需要認真考慮使用sync_binlog=1。
問題是sync_binlog=1代價比較高 – 現在每個事務也要同步一次到硬碟。你可能會想為什麼不把兩次同步合併成一次,想法正確 – 新版本的MySQL(5.6和5.7,MariaDB和Percona Server)已經能合併提交,那麼在這種情況下sync_binlog=1的操作也不是這麼昂貴了,但在舊的mysql版本中仍然會對性能有很大影響。
6.INNODB_FLUSH_METHOD
將innodb_flush_method設置為O_DIRECT以避免雙重緩衝.唯一一種情況你不應該使用O_DIRECT是當你操作系統不支持時。但如果你運行的是Linux,使用O_DIRECT來激活直接IO。
不用直接IO,雙重緩衝將會發生,因為所有的資料庫更改首先會寫入到OS緩存然後才同步到硬碟 – 所以InnoDB緩衝池和OS緩存會同時持有一份相同的數據。特別是如果你的緩衝池限制為總內存的50%,那意味著在寫密集的環境中你可能會浪費高達50%的內存。如果沒有限制為50%,伺服器可能由於OS緩存的高壓力會使用到swap。
簡單地說,設置為innodb_flush_method=O_DIRECT。
7.INNODB_BUFFER_POOL_INSTANCES
MySQL 5.5引入了緩衝實例作為減小內部鎖爭用來提高MySQL吞吐量的手段。
在5.5版本這個對提升吞吐量幫助很小,然後在MySQL 5.6版本這個提升就非常大了,所以在MySQL5.5中你可能會保守地設置innodb_buffer_pool_instances=4,在MySQL 5.6和5.7中你可以設置為8-16個緩衝池實例。
你設置後觀察會覺得性能提高不大,但在大多數高負載情況下,它應該會有不錯的表現。
對了,不要指望這個設置能減少你單個查詢的響應時間。這個是在高並發負載的伺服器上才看得出區別。比如多個線程同時做許多事情。
8.INNODB_THREAD_CONCURRENCY
InnoDB有一種方法來控制並行執行的線程數 – 我們稱為並發控制機制。大部分是由innodb_thread_concurrency值來控制的。如果設置為0,並發控制就關閉了,因此InnoDB會立即處理所有進來的請求(儘可能多的)。
在你有32CPU核心且只有4個請求時會沒什麼問題。不過想像下你只有4CPU核心和32個請求時 – 如果你讓32個請求同時處理,你這個自找麻煩。因為這些32個請求只有4 CPU核心,顯然地會比平常慢至少8倍(實際上是大於8倍),而然這些請求每個都有自己的外部和內部鎖,這有很大可能堆積請求。
下面介紹如何更改這個變數,在mysql命令行提示符執行:
對於大多數工作負載和伺服器,設置為8是一個好開端,然後你可以根據伺服器達到了這個限制而資源使用率利用不足時逐漸增加。可以通過show engine innodb status\G來查看目前查詢處理情況,查找類似如下行:
9.SKIP_NAME_RESOLVE
這一項不得不提及,因為仍然有很多人沒有添加這一項。你應該添加skip_name_resolve來避免連接時DNS解析。
大多數情況下你更改這個會沒有什麼感覺,因為大多數情況下DNS伺服器解析會非常快。不過當DNS伺服器失敗時,它會出現在你伺服器上出現「unauthenticated connections」 ,而就是為什麼所有的請求都突然開始慢下來了。
所以不要等到這種事情發生才更改。現在添加這個變數並且避免基於主機名的授權。
10.INNODB_IO_CAPACITY, INNODB_IO_CAPACITY_MAX
* innodb_io_capacity:用來當刷新臟數據時,控制MySQL每秒執行的寫IO量。
* innodb_io_capacity_max: 在壓力下,控制當刷新臟數據時MySQL每秒執行的寫IO量
首先,這與讀取無關 – SELECT查詢執行的操作。對於讀操作,MySQL會盡最大可能處理並返回結果。至於寫操作,MySQL在後台會循環刷新,在每一個循環會檢查有多少數據需要刷新,並且不會用超過innodb_io_capacity指定的數來做刷新操作。這也包括更改緩衝區合併(在它們刷新到磁碟之前,更改緩衝區是輔助臟頁存儲的關鍵)。
第二,我需要解釋一下什麼叫「在壓力下」,MySQL中稱為」緊急情況」,是當MySQL在後台刷新時,它需要刷新一些數據為了讓新的寫操作進來。然後,MySQL會用到innodb_io_capacity_max。
那麼,應該設置innodb_io_capacity和innodb_io_capacity_max為什麼呢?
最好的方法是測量你的存儲設置的隨機寫吞吐量,然後給innodb_io_capacity_max設置為你的設備能達到的最大IOPS。innodb_io_capacity就設置為它的50-75%,特別是你的系統主要是寫操作時。
通常你可以預測你的系統的IOPS是多少。例如由8 15k硬碟組成的RAID10能做大約每秒1000隨機寫操作,所以你可以設置innodb_io_capacity=600和innodb_io_capacity_max=1000。許多廉價企業SSD可以做4,000-10,000 IOPS等。
這個值設置得不完美問題不大。但是,要注意默認的200和400會限制你的寫吞吐量,因此你可能偶爾會捕捉到刷新進程。如果出現這種情況,可能是已經達到你硬碟的寫IO吞吐量,或者這個值設置得太小限制了吞吐量。
11.INNODB_STATS_ON_METADATA
如果你跑的是MySQL 5.6或5.7,你不需要更改innodb_stats_on_metadata的默認值,因為它已經設置正確了。
不過在MySQL 5.5或5.1,強烈建議關閉這個變數 – 如果是開啟,像命令show table status會立即查詢INFORMATION_SCHEMA而不是等幾秒再執行,這會使用到額外的IO操作。
從5.1.32版本開始,這個是動態變數,意味著你不需要重啟MySQL伺服器來關閉它。
12.INNODB_BUFFER_POOL_DUMP_AT_SHUTDOWN INNODB_BUFFER_POOL_LOAD_AT_STARTUP
innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup這兩個變數與性能無關,不過如果你偶爾重啟mysql伺服器(如生效配置),那麼就有關。當兩個都激活時,MySQL緩衝池的內容(更具體地說,是緩存頁)在停止MySQL時存儲到一個文件。當你下次啟動MySQL時,它會在後台啟動一個線程來載入緩衝池的內容以提高預熱速度到3-5倍。
兩件事:
第一,它實際上沒有在關閉時複製緩衝池內容到文件,僅僅是複製表空間ID和頁面ID – 足夠的信息來定位硬碟上的頁面了。然後它就能以大量的順序讀非常快速的載入那些頁面,而不是需要成千上萬的小隨機讀。
第二,啟動時是在後台載入內容,因為MySQL不需要等到緩衝池內容載入完成再開始接受請求(所以看起來不會有什麼影響)。
從MySQL 5.7.7開始,默認只有25%的緩衝池頁面在mysql關閉時存儲到文件,但是你可以控制這個值 – 使用innodb_buffer_pool_dump_pct,建議75-100。
這個特性從MySQL 5.6才開始支持。
13.INNODB_ADAPTIVE_HASH_INDEX_PARTS
如果你運行著一個大量SELECT查詢的MySQL伺服器(並且已經儘可能優化),那麼自適應哈希索引將下你的下一個瓶頸。自適應哈希索引是InnoDB內部維護的動態索引,可以提高最常用的查詢模式的性能。這個特性可以重啟伺服器關閉,不過默認下在mysql的所有版本開啟。
這個技術非常複雜,在大多數情況下它會對大多數類型的查詢直到加速的作用。不過,當你有太多的查詢往資料庫,在某一個點上它會花過多的時間等待AHI鎖和閂鎖。
如果你的是MySQL 5.7,沒有這個問題 – innodb_adaptive_hash_index_parts默認設置為8,所以自適應哈希索引被切割為8個分區,因為不存在全局互斥。
不過在mysql 5.7前的版本,沒有AHI分區數量的控制。換句話說,有一個全局互斥鎖來保護AHI,可能導致你的select查詢經常撞牆。
所以如果你運行的是5.1或5.6,並且有大量的select查詢,最簡單的方案就是切換成同一版本的Percona Server來激活AHI分區。
14.QUERY_CACHE_TYPE
如果人認為查詢緩存效果很好,肯定應該使用它。好吧,有時候是有用的。不過這個只在你在低負載時有用,特別是在低負載下大多數是讀取,小量寫或者沒有。
如果是那樣的情況,設置query_cache_type=ON和query_cache_size=256M就好了。不過記住不能把256M設置更高的值了,否則會由於查詢緩存失效時,導致引起嚴重的伺服器停頓。
如果你的MySQL伺服器高負載動作,建議設置query_cache_size=0和query_cache_type=OFF,並重啟伺服器生效。那樣Mysql就會停止在所有的查詢使用查詢緩存互斥鎖。
15.TABLE_OPEN_CACHE_INSTANCES
從MySQL 5.6.6開始,表緩存能分割到多個分區。
表緩存用來存放目前已打開表的列表,當每一個表打開或關閉互斥體就被鎖定 – 即使這是一個隱式臨時表。使用多個分區絕對減少了潛在的爭用。
從MySQL 5.7.8開始,table_open_cache_instances=16是默認的配置。
歡迎做Java的工程師朋友們私信我資料免費獲取免費的Java架構學習資料(裡面有高可用、高並發、高性能及分散式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)
其中覆蓋了互聯網的方方面面,期間碰到各種產品各種場景下的各種問題,很值得大家借鑒和學習,擴展自己的技術廣度和知識面。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/245900.html