每日動態(tài)!如何做mysql調(diào)優(yōu)?絕命7招,讓慢SQL調(diào)優(yōu)100倍
時間:2023-06-22 18:21:11
文章很長,且持續(xù)更新,建議收藏起來,慢慢讀!瘋狂創(chuàng)客圈總目錄 博客園版為您奉上珍貴的學(xué)習(xí)資源 :
免費贈送 :《尼恩Java面試寶典》持續(xù)更新+ 史上最全 + 面試必備 2000頁+ 面試必備 + 大廠必備 +漲薪必備免費贈送 :《尼恩技術(shù)圣經(jīng)+高并發(fā)系列PDF》,幫你 實現(xiàn)技術(shù)自由,完成職業(yè)升級, 薪酬猛漲!加尼恩免費領(lǐng)免費贈送 經(jīng)典圖書:《Java高并發(fā)核心編程(卷1)加強(qiáng)版》面試必備 + 大廠必備 +漲薪必備 加尼恩免費領(lǐng)免費贈送 經(jīng)典圖書:《Java高并發(fā)核心編程(卷2)加強(qiáng)版》面試必備 + 大廠必備 +漲薪必備 加尼恩免費領(lǐng)免費贈送 經(jīng)典圖書:《Java高并發(fā)核心編程(卷3)加強(qiáng)版》面試必備 + 大廠必備 +漲薪必備 加尼恩免費領(lǐng)
(資料圖片)
免費贈送 資源寶庫: Java 必備 百度網(wǎng)盤資源大合集 價值>10000元 加尼恩領(lǐng)取
如何做mysql調(diào)優(yōu)?絕命7招,讓慢SQL調(diào)優(yōu)100倍
前言:
在40歲老架構(gòu)師尼恩的讀者社群(50+)中,很多小伙伴拿不到offer,或者拿不到好的offer。
尼恩經(jīng)常給大家 優(yōu)化項目,優(yōu)化簡歷,挖掘技術(shù)亮點。在指導(dǎo)簡歷的過程中, Java 調(diào)優(yōu)是一項很重要的指導(dǎo)。
問題是,很多小伙伴,連一點調(diào)優(yōu)的基礎(chǔ)都沒有, 當(dāng)然,連高并發(fā)的場景也搞不清楚。
實際上,無論是調(diào)優(yōu),還是高并發(fā)的場景,我們都需要解決一些基礎(chǔ)問題,比如說:
一億用戶量,平均每人每天10次的業(yè)務(wù)量,要求并發(fā)數(shù)在5000以上,峰值在5w到10w之間,QPS在25w以上, 如何進(jìn)行壓測?如何進(jìn)行調(diào)優(yōu)?
對于架構(gòu)師、高級開發(fā)來說, 調(diào)優(yōu)是 核心內(nèi)容, 那么壓測更是內(nèi)功中的內(nèi)功。
尼恩團(tuán)隊結(jié)合資深架構(gòu)經(jīng)驗和行業(yè)案例,給大家梳理一個系列的《Java 調(diào)優(yōu)圣經(jīng)》PDF電子書,包括本文在內(nèi)規(guī)劃的五個部分:
(1) 調(diào)優(yōu)圣經(jīng)1:零基礎(chǔ)精通Jmeter分布式壓測,10Wqps+壓測實操 (已經(jīng)完成)
(2) 調(diào)優(yōu)圣經(jīng)2:從70s到20ms,一次3500倍性能優(yōu)化實戰(zhàn),方案人人可用 (已經(jīng)完成)
(3) 調(diào)優(yōu)圣經(jīng)4:如何做mysql調(diào)優(yōu)?絕命7招讓慢SQL調(diào)優(yōu)100倍,實現(xiàn)你的Mysql調(diào)優(yōu)自由 (本文)
(4) 調(diào)優(yōu)圣經(jīng)3:零基礎(chǔ)精通JVM調(diào)優(yōu)實操,實現(xiàn)JVM自由 (寫作中)
(5) 調(diào)優(yōu)圣經(jīng)5:零基礎(chǔ)精通Linux、Tomcatl調(diào)優(yōu)實操,實現(xiàn)基礎(chǔ)設(shè)施調(diào)優(yōu)自由 (寫作中)
以上的多篇文章,后續(xù)將陸續(xù)在 技術(shù)自由圈 公眾號發(fā)布。 完整的《Java 調(diào)優(yōu)圣經(jīng)》PDF,可以找尼恩獲取。
本文目錄
目錄- 如何做mysql調(diào)優(yōu)?絕命7招,讓慢SQL調(diào)優(yōu)100倍
- 前言:
- 本文目錄
- mysql調(diào)優(yōu)的背景:
- 讓"慢SQL"提速100倍的絕命7招
- 案例背景:
- 數(shù)據(jù)庫配置調(diào)優(yōu)
- 調(diào)整數(shù)據(jù)庫緩沖區(qū)大小和線程池設(shè)置
- 優(yōu)化InnoDB存儲引擎的參數(shù)配置
- 調(diào)整日志和鎖定策略以提高并發(fā)性能
- 硬件和操作系統(tǒng)優(yōu)化
- 硬件配置
- 操作系統(tǒng)配置
- 查詢優(yōu)化
- 查詢優(yōu)化主要手段
- 優(yōu)化查詢語句:
- 創(chuàng)建適當(dāng)?shù)乃饕?/li>
- 優(yōu)化數(shù)據(jù)模型和表結(jié)構(gòu):
- 監(jiān)測和分析查詢性能:
- 定期維護(hù)和優(yōu)化:
- 電商場景案例實戰(zhàn)
- 準(zhǔn)備工作
- 場景1:用戶搜索
- 場景2:訂單查詢
- 場景3:分頁查詢
- 場景4:訂單統(tǒng)計報表查詢
- 查詢優(yōu)化主要手段
- MySQL性能監(jiān)控與報警
- MySQL調(diào)優(yōu)小結(jié)
- 《Java 調(diào)優(yōu)圣經(jīng)》迭代計劃
- 技術(shù)自由的實現(xiàn)路徑:
- 實現(xiàn)你的 響應(yīng)式 自由:
- 實現(xiàn)你的 spring cloud 自由:
- 實現(xiàn)你的 linux 自由:
- 實現(xiàn)你的 網(wǎng)絡(luò) 自由:
- 實現(xiàn)你的 分布式鎖 自由:
- 實現(xiàn)你的 王者組件 自由:
- 實現(xiàn)你的 面試題 自由:
- 獲取11個技術(shù)圣經(jīng)PDF:
mysql調(diào)優(yōu)的背景:
MySQL是一款廣泛應(yīng)用于各種規(guī)模和類型的應(yīng)用程序的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。在實際的數(shù)據(jù)庫應(yīng)用中,我們常常面臨著各種性能瓶頸和挑戰(zhàn)。
當(dāng)數(shù)據(jù)庫性能下降時,應(yīng)用程序的響應(yīng)時間延長、吞吐量降低,甚至可能導(dǎo)致系統(tǒng)崩潰。
因此,對MySQL進(jìn)行調(diào)優(yōu)是確保數(shù)據(jù)庫系統(tǒng)高效運行的關(guān)鍵一環(huán)。
在實際使用MySQL的過程中,我們可能會遇到一系列問題,例如:
查詢性能下降:某些查詢語句執(zhí)行速度緩慢,導(dǎo)致應(yīng)用程序的響應(yīng)時間變慢,用戶體驗下降。
并發(fā)訪問問題:當(dāng)多個用戶同時訪問數(shù)據(jù)庫時,可能會出現(xiàn)鎖競爭、死鎖等并發(fā)訪問問題,導(dǎo)致系統(tǒng)性能下降。
數(shù)據(jù)庫配置不當(dāng):MySQL的默認(rèn)配置可能無法滿足特定應(yīng)用程序的需求,需要對參數(shù)進(jìn)行適當(dāng)調(diào)整,以獲得更好的性能。
硬件和操作系統(tǒng)限制:數(shù)據(jù)庫服務(wù)器的硬件和操作系統(tǒng)資源可能成為瓶頸,影響數(shù)據(jù)庫的性能表現(xiàn)。
存儲引擎選擇:選擇合適的存儲引擎對于某些特定的應(yīng)用場景至關(guān)重要,不同的存儲引擎具有不同的性能特點。
面對這些問題,我們需要采取一系列的調(diào)優(yōu)措施,以提升MySQL數(shù)據(jù)庫的性能和可擴(kuò)展性。
本文將通過實際案例,探討MySQL調(diào)優(yōu)的關(guān)鍵步驟和技巧,幫助大家了解如何識別和解決常見的性能問題,從而優(yōu)化數(shù)據(jù)庫系統(tǒng)的性能表現(xiàn)。
在接下來的內(nèi)容中,我們通過相關(guān)案例來深入探討監(jiān)測和診斷、查詢優(yōu)化、數(shù)據(jù)庫配置調(diào)優(yōu)、硬件和操作系統(tǒng)優(yōu)化等方面的具體技術(shù)和實踐,以幫助讀者全面理解MySQL調(diào)優(yōu)的實戰(zhàn)過程,并最終提升其應(yīng)用程序的性能和穩(wěn)定性。
讓"慢SQL"提速100倍的絕命7招
MySQL查詢優(yōu)化、調(diào)優(yōu)是生產(chǎn)中常見難題,也是常見面試題,尼恩團(tuán)隊總結(jié)了大量的生產(chǎn)案例和實踐經(jīng)驗,為大家提煉了讓”慢SQL"提速100倍的絕命七大招 :
第1招: 索引優(yōu)化:
- 合理設(shè)計索引:根據(jù)查詢的條件和訪問模式,設(shè)計適當(dāng)?shù)乃饕?,包括單列索引、組合索引、唯一索引等。
- 避免過多索引:過多的索引會增加數(shù)據(jù)維護(hù)的開銷,同時也會降低更新操作的性能。
- 定期維護(hù)索引:刪除不再使用的索引,重新構(gòu)建或重組索引,以提高索引的效率和性能。
第2招: 覆蓋索引:
- 利用覆蓋索引避免回表操作:如果查詢的字段都包含在索引中,可以避免訪問主表的數(shù)據(jù)行,從而提高查詢性能。
第3招: 索引下推:
- 利用索引下推(Index Condition Pushdown)優(yōu)化查詢:MySQL 5.6+版本支持索引下推,可以在索引層面進(jìn)行部分條件的過濾,減少回表操作,提高查詢效率。
第4招: 子查詢優(yōu)化:
- 盡量避免使用大量的子查詢:過多的子查詢會增加查詢的復(fù)雜度和開銷??梢酝ㄟ^優(yōu)化查詢語句,將子查詢轉(zhuǎn)化為連接查詢、臨時表等方式來提高性能。
- 使用合適的子查詢類型:根據(jù)具體場景選擇適合的子查詢類型,如標(biāo)量子查詢、關(guān)聯(lián)子查詢、存在子查詢等。
第5招: 排序優(yōu)化:
- 避免在查詢中進(jìn)行不必要的排序:如果查詢不需要排序結(jié)果,可以通過調(diào)整查詢條件或索引設(shè)計來避免排序操作,提高查詢性能。
- 優(yōu)化排序操作:對于需要排序的查詢,可以通過合理的索引設(shè)計、增加排序緩沖區(qū)的大小、調(diào)整排序算法等方式來優(yōu)化排序操作。
第6招: 查詢緩存的使用:
- 合理使用查詢緩存:查詢緩存可以緩存查詢結(jié)果,提高查詢性能。但是在高并發(fā)環(huán)境下,查詢緩存的效果可能不理想,因此需要根據(jù)具體情況進(jìn)行配置和使用。
第7招: SQL語句優(yōu)化:
- 優(yōu)化查詢語句的寫法:合理選擇查詢方式、使用正確的關(guān)鍵字和函數(shù),減少不必要的計算和數(shù)據(jù)操作。
- 避免全表掃描:盡量使用索引覆蓋查詢,避免全表掃描操作,減少IO開銷和查詢時間。
尼恩團(tuán)隊提煉了絕命七招 ,讓”慢SQL"提速100倍, 下面就看一個全面的調(diào)優(yōu)案例。
案例背景:
在本文中,我們將以一個在線電商網(wǎng)站為例,探討MySQL調(diào)優(yōu)的實戰(zhàn)案例。該電商網(wǎng)站作為一個熱門的在線購物平臺,每天都有大量用戶進(jìn)行商品瀏覽、下單等操作。
然而,隨著用戶數(shù)量的增加和交易量的增長,他們的數(shù)據(jù)庫性能遇到了一些挑戰(zhàn)。
該電商網(wǎng)站的數(shù)據(jù)庫主要存儲了產(chǎn)品信息、用戶信息、訂單等重要數(shù)據(jù)。隨著業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫規(guī)模逐漸增大,表中的記錄數(shù)量和索引數(shù)量也急劇增加。隨之而來的是一系列性能問題的出現(xiàn)。
首先,用戶在進(jìn)行商品搜索或瀏覽時,一些查詢語句的執(zhí)行速度變慢,導(dǎo)致網(wǎng)站響應(yīng)時間延長。用戶體驗下降,甚至可能導(dǎo)致用戶流失。
其次,網(wǎng)站在特定時間段,如促銷活動期間,會出現(xiàn)高并發(fā)的情況。大量用戶同時訪問數(shù)據(jù)庫,可能導(dǎo)致鎖競爭、死鎖等并發(fā)訪問問題,進(jìn)而影響系統(tǒng)的性能和可用性。
此外,數(shù)據(jù)庫服務(wù)器的硬件資源和操作系統(tǒng)參數(shù)配置也可能成為性能瓶頸。原有的硬件和操作系統(tǒng)設(shè)置無法滿足當(dāng)前數(shù)據(jù)庫負(fù)載的需求,導(dǎo)致數(shù)據(jù)庫性能無法充分發(fā)揮。
在面對這些挑戰(zhàn)時,必須進(jìn)行MySQL調(diào)優(yōu),以提升數(shù)據(jù)庫性能和可擴(kuò)展性。我們可以通過優(yōu)化查詢語句、調(diào)整數(shù)據(jù)庫配置參數(shù)、優(yōu)化存儲引擎和硬件等措施,解決性能瓶頸和并發(fā)訪問問題,并確保數(shù)據(jù)庫能夠穩(wěn)定高效地支持日益增長的業(yè)務(wù)需求。
在接下來的內(nèi)容中,我們將詳細(xì)介紹該電商網(wǎng)站所采取的調(diào)優(yōu)步驟和實踐經(jīng)驗,展示如何通過系統(tǒng)的MySQL調(diào)優(yōu)方法,提升數(shù)據(jù)庫性能、優(yōu)化查詢效率,并實現(xiàn)快速、可靠的在線購物體驗。
MySQL調(diào)優(yōu)環(huán)節(jié)主要包括:
- 數(shù)據(jù)庫配置調(diào)優(yōu)
- 硬件及操作系統(tǒng)調(diào)優(yōu)
- SQL語句查詢優(yōu)化
下面我們首先了解下數(shù)據(jù)庫配置調(diào)優(yōu):
數(shù)據(jù)庫配置調(diào)優(yōu)
數(shù)據(jù)庫配置是MySQL調(diào)優(yōu)的重要一環(huán),通過合理地調(diào)整數(shù)據(jù)庫的參數(shù)設(shè)置,可以顯著改善性能和資源利用率。
在本章中,我們將探討一些關(guān)鍵的數(shù)據(jù)庫配置調(diào)優(yōu)策略,并提供相應(yīng)的實際腳本或命令示例。
調(diào)整數(shù)據(jù)庫緩沖區(qū)大小和線程池設(shè)置
InnoDB緩沖池大小(innodb_buffer_pool_size):
對于電商網(wǎng)站平臺,我們建議將該參數(shù)設(shè)置為整個服務(wù)器內(nèi)存的70%-80%。
例如,如果服務(wù)器具有16GB的內(nèi)存,則可以將緩沖池大小設(shè)置為12GB-14GB,以確保大部分?jǐn)?shù)據(jù)和索引可以緩存在內(nèi)存中,提高讀取性能。
示例:
mysql> SHOW VARIABLES LIKE "innodb_buffer_pool_size";+-------------------------+-----------+| Variable_name | Value |+-------------------------+-----------+| innodb_buffer_pool_size | 134217728 |+-------------------------+-----------+1 row in set (0.00 sec)mysql> SET GLOBAL innodb_buffer_pool_size = 12*1024*1024*1024;Query OK, 0 rows affected (0.00 sec)查詢緩存設(shè)置(query_cache_type、query_cache_size):
在電商網(wǎng)站平臺中,由于更新頻率較高,我們建議禁用查詢緩存。
查詢緩存在高并發(fā)和頻繁更新的環(huán)境下可能帶來更多的性能負(fù)擔(dān)。
示例:
mysql> SHOW VARIABLES LIKE "query_cache%";+------------------------------+---------+| Variable_name | Value |+------------------------------+---------+| query_cache_limit | 1048576 || query_cache_min_res_unit | 4096 || query_cache_size | 1048576 || query_cache_type | OFF || query_cache_wlock_invalidate | OFF |+------------------------------+---------+5 rows in set (0.00 sec)在MySQL配置文件中進(jìn)行查詢緩存設(shè)置:
[mysqld]query_cache_type = 0query_cache_size = 0線程池設(shè)置(thread_pool_size、thread_pool_max_threads):
針對電商網(wǎng)站平臺的高并發(fā)訪問,我們建議根據(jù)預(yù)估的并發(fā)連接數(shù)和系統(tǒng)負(fù)載情況,適當(dāng)調(diào)整線程池的大小和最大線程數(shù)。
可以先根據(jù)實際情況設(shè)置較小的值,然后通過監(jiān)控系統(tǒng)負(fù)載和連接池狀態(tài)來進(jìn)行動態(tài)調(diào)整。
示例:
SHOW VARIABLES LIKE "thread_pool%";在MySQL配置文件中進(jìn)行線程池設(shè)置:
[mysqld]thread_pool_size = 100thread_pool_max_threads = 200
優(yōu)化InnoDB存儲引擎的參數(shù)配置
日志配置(innodb_log_file_size、innodb_log_buffer_size):
對于電商網(wǎng)站平臺,我們建議根據(jù)數(shù)據(jù)庫的日志寫入速度和事務(wù)處理量來調(diào)整日志文件大小和緩沖區(qū)大小。
一般而言,日志文件大小應(yīng)該足夠大,以減少日志切換的頻率,同時緩沖區(qū)大小應(yīng)該能容納一定數(shù)量的日志寫入。
示例:
mysql> SHOW VARIABLES LIKE "innodb_log_file%";+---------------------------+----------+| Variable_name | Value |+---------------------------+----------+| innodb_log_file_size | 50331648 || innodb_log_files_in_group | 2 |+---------------------------+----------+2 rows in set (0.00 sec)調(diào)整日志文件大小和緩沖區(qū)大?。?/p>
SET GLOBAL innodb_log_file_size = 1G;SET GLOBAL innodb_log_buffer_size = 32M;在MySQL配置文件中進(jìn)行永久設(shè)置:
[mysqld]innodb_log_file_size = 1Ginnodb_log_buffer_size = 32M鎖定配置(innodb_lock_wait_timeout):
對于電商網(wǎng)站平臺的并發(fā)訪問,我們建議將鎖定等待超時時間設(shè)置為較短的值,以減少長時間的鎖定等待。
一般而言,可以將鎖定等待超時時間設(shè)置為幾秒鐘。
示例:
mysql> SHOW VARIABLES LIKE "innodb_lock_wait_timeout";+--------------------------+-------+| Variable_name | Value |+--------------------------+-------+| innodb_lock_wait_timeout | 50 |+--------------------------+-------+1 row in set (0.00 sec)調(diào)整鎖定等待超時時間:
SET GLOBAL innodb_lock_wait_timeout = 5;在MySQL配置文件中進(jìn)行永久設(shè)置:
[mysqld]innodb_lock_wait_timeout = 5自動增長參數(shù)(innodb_autoinc_lock_mode):對于電商網(wǎng)站平臺的高并發(fā)環(huán)境,建議將自動增長鎖定模式設(shè)置為"2",即使用連續(xù)的批量插入模式。這樣可以減少自動增長字段的鎖定沖突,提高并發(fā)性能。
示例:
mysql> SHOW VARIABLES LIKE "innodb_autoinc_lock_mode";+--------------------------+-------+| Variable_name | Value |+--------------------------+-------+| innodb_autoinc_lock_mode | 1 |+--------------------------+-------+1 row in set (0.00 sec)調(diào)整自動增長鎖定模式:
SET GLOBAL innodb_autoinc_lock_mode = 2;在MySQL配置文件中進(jìn)行永久設(shè)置:
[mysqld]innodb_autoinc_lock_mode = 2
調(diào)整日志和鎖定策略以提高并發(fā)性能
事務(wù)隔離級別(transaction-isolation):對于電商網(wǎng)站平臺,建議將事務(wù)隔離級別設(shè)置為"READ-COMMITTED",以平衡并發(fā)性能和數(shù)據(jù)一致性的需求。
示例:
mysql> SELECT @@global.tx_isolation;+-----------------------+| @@global.tx_isolation |+-----------------------+| REPEATABLE-READ |+-----------------------+1 row in set, 1 warning (0.00 sec)設(shè)置事務(wù)隔離級別:
mysql> SET GLOBAL tx_isolation = "READ-COMMITTED";Query OK, 0 rows affected, 1 warning (0.00 sec)在MySQL配置文件中進(jìn)行永久設(shè)置:
[mysqld]transaction-isolation = READ-COMMITTED并發(fā)控制策略(innodb_thread_concurrency):
根據(jù)電商網(wǎng)站平臺的并發(fā)連接數(shù)和系統(tǒng)負(fù)載情況,適當(dāng)調(diào)整并發(fā)控制策略。
可以先將innodb_thread_concurrency設(shè)置為0,讓MySQL根據(jù)系統(tǒng)負(fù)載動態(tài)調(diào)整線程并發(fā)數(shù)。
示例:
mysql> SHOW VARIABLES LIKE "innodb_thread_concurrency";+---------------------------+-------+| Variable_name | Value |+---------------------------+-------+| innodb_thread_concurrency | 0 |+---------------------------+-------+1 row in set (0.00 sec)在MySQL配置文件中進(jìn)行線程并發(fā)控制設(shè)置:
[mysqld]innodb_thread_concurrency = 0鎖定優(yōu)化:對于電商網(wǎng)站平臺中頻繁更新的表,應(yīng)盡量使用行級鎖定代替表級鎖定,以減少鎖沖突和提高并發(fā)性能。在需要使用行級鎖定的表上加上適當(dāng)?shù)乃饕?,可以進(jìn)一步提高并發(fā)性能。
通過細(xì)致的數(shù)據(jù)庫配置調(diào)優(yōu),我們可以最大程度地提升MySQL數(shù)據(jù)庫的性能和可靠性,從而確保電商網(wǎng)站平臺的高并發(fā)訪問和事務(wù)處理能力。
在實際應(yīng)用中,建議根據(jù)具體業(yè)務(wù)需求和系統(tǒng)狀況,進(jìn)行性能測試和評估,并定期進(jìn)行調(diào)優(yōu)和優(yōu)化的檢查。
在接下來的章節(jié)中,我們將深入探討硬件和操作系統(tǒng)優(yōu)化的關(guān)鍵步驟,以全面提升MySQL數(shù)據(jù)庫的性能和可靠性。
硬件和操作系統(tǒng)優(yōu)化
硬件和操作系統(tǒng)的優(yōu)化對于MySQL數(shù)據(jù)庫的性能和穩(wěn)定性同樣至關(guān)重要。
在電商網(wǎng)站平臺中,針對高并發(fā)訪問和大量數(shù)據(jù)處理的需求,我們可以通過以下配置和優(yōu)化策略來提升系統(tǒng)性能。
硬件配置
硬件配置是根據(jù)具體的需求和預(yù)算來確定的,因此可能因情況而異。
然而,可以根據(jù)上述電商網(wǎng)站平臺的特點,提供一個合理的硬件配置參考:
內(nèi)存(RAM):
分配足夠的內(nèi)存以容納數(shù)據(jù)庫的緩存和索引數(shù)據(jù)。
對于中型到大型的電商網(wǎng)站平臺,建議選擇至少64GB到128GB的內(nèi)存。
對于更大規(guī)模的平臺,可能需要更高容量的內(nèi)存。
存儲設(shè)備:
選擇高性能的存儲設(shè)備以提供快速的數(shù)據(jù)讀寫能力。
對于數(shù)據(jù)文件和日志文件,建議使用固態(tài)硬盤(SSD)或者NVMe SSD,以提高數(shù)據(jù)訪問速度。
對于較大的數(shù)據(jù)量,可以考慮使用RAID陣列以提供更好的性能和冗余。
CPU:
選擇多核心的CPU以提高并發(fā)處理能力。
對于大型電商網(wǎng)站平臺,建議選擇高性能的服務(wù)器級CPU,例如Intel Xeon系列或AMD EPYC系列,考慮配置4核或更多核心的CPU和高頻率的處理器。
網(wǎng)絡(luò)帶寬:
確保有足夠的網(wǎng)絡(luò)帶寬來處理大量的并發(fā)請求和數(shù)據(jù)傳輸。
對于電商網(wǎng)站平臺,建議選擇高速網(wǎng)絡(luò)連接,例如千兆以太網(wǎng)或更高速率的網(wǎng)絡(luò)。
請注意,這僅是一個大致的硬件配置參考,具體的硬件需求還應(yīng)根據(jù)實際情況、預(yù)算和性能要求進(jìn)行綜合考慮。
當(dāng)然,一般中大型的電商平臺基本都會采用mysql集群部署,集群部署還需要考慮以下方面:
數(shù)據(jù)分片:將數(shù)據(jù)庫的數(shù)據(jù)分散到多個節(jié)點上。每個節(jié)點負(fù)責(zé)管理一部分?jǐn)?shù)據(jù)。在配置分布式MySQL時,需要確定數(shù)據(jù)分片的策略和規(guī)則,例如按照用戶ID、地理位置或其他業(yè)務(wù)相關(guān)的方式進(jìn)行分片。
主從復(fù)制:在每個節(jié)點上配置主從復(fù)制,以實現(xiàn)數(shù)據(jù)的復(fù)制和同步。主節(jié)點負(fù)責(zé)處理寫操作,從節(jié)點負(fù)責(zé)處理讀操作。通過主從復(fù)制可以提高系統(tǒng)的可用性和擴(kuò)展性。
負(fù)載均衡:使用負(fù)載均衡器將請求分發(fā)到不同的數(shù)據(jù)庫節(jié)點上。負(fù)載均衡器可以根據(jù)負(fù)載情況、節(jié)點狀態(tài)和其他策略來決定將請求發(fā)送到哪個節(jié)點。常見的負(fù)載均衡器包括Nginx、HAProxy等。
高可用性:配置故障切換和自動故障恢復(fù)機(jī)制,以確保系統(tǒng)在節(jié)點故障時仍然可用??梢允褂弥鲝膹?fù)制和心跳監(jiān)測來實現(xiàn)高可用性。
安全性:為分布式MySQL配置適當(dāng)?shù)陌踩胧?,包括訪問控制、加密傳輸、防火墻設(shè)置等,以保護(hù)數(shù)據(jù)的安全性和完整性。
網(wǎng)絡(luò)通信:確保節(jié)點之間的網(wǎng)絡(luò)通信暢通,延遲較低,可以考慮使用高速網(wǎng)絡(luò)連接和優(yōu)化網(wǎng)絡(luò)設(shè)置。
監(jiān)控和性能優(yōu)化:配置監(jiān)控工具和性能優(yōu)化工具,對分布式MySQL進(jìn)行實時監(jiān)控和性能調(diào)優(yōu)??梢允褂霉ぞ呷鏟rometheus、Grafana等進(jìn)行監(jiān)控和數(shù)據(jù)分析。
擴(kuò)展性:考慮未來的擴(kuò)展需求,設(shè)計可擴(kuò)展的架構(gòu)和配置。例如,添加更多的節(jié)點、調(diào)整分片策略等。
以上是分布式MySQL服務(wù)器的一般配置原則。具體的配置取決于應(yīng)用需求、數(shù)據(jù)量、預(yù)算和性能要求。
操作系統(tǒng)配置
在操作系統(tǒng)層面配置以滿足MySQL優(yōu)化,以下是一些常見的配置項及其詳細(xì)描述、作用、配置方式、腳本和命令:
文件描述符限制:
文件描述符是操作系統(tǒng)用于追蹤打開的文件的標(biāo)識符。
調(diào)整文件描述符限制可以提高M(jìn)ySQL處理并發(fā)連接和文件操作的能力。
文件配置方式:
- 編輯
/etc/security/limits.conf文件,增加以下配置:* soft nofile 65536* hard nofile 65536
命令配置方式:
- 設(shè)置軟限制:
ulimit -n 65536 - 設(shè)置硬限制:
ulimit -Hn 65536
說明:
MySQL使用文件描述符來管理數(shù)據(jù)庫文件、日志文件等。
通過增加文件描述符限制,可以讓MySQL同時打開更多的文件,提高并發(fā)連接和文件操作的能力。
- 編輯
網(wǎng)絡(luò)參數(shù)調(diào)優(yōu):
調(diào)整網(wǎng)絡(luò)參數(shù)可以改善數(shù)據(jù)庫的網(wǎng)絡(luò)通信性能。
配置方式:
編輯
/etc/sysctl.conf文件,增加以下配置:net.core.somaxconn = 65535net.ipv4.tcp_max_syn_backlog = 65535net.ipv4.tcp_tw_reuse = 1重新加載配置文件:
sysctl -p
說明:
net.core.somaxconn:指定系統(tǒng)在處于隊列狀態(tài)下的最大連接數(shù),增加該值可以增加同時連接到MySQL服務(wù)器的客戶端數(shù)量。net.ipv4.tcp_max_syn_backlog:指定操作系統(tǒng)處理未完成三次握手的連接請求的最大數(shù)量,增加該值可以容納更多的連接請求。net.ipv4.tcp_tw_reuse:啟用TCP連接的地址重用功能,可以減少TIME-WAIT狀態(tài)的連接數(shù)量,釋放系統(tǒng)資源。
時間同步:
時間同步確保數(shù)據(jù)庫服務(wù)器的時間準(zhǔn)確性,防止因時間不同步導(dǎo)致的數(shù)據(jù)問題。
配置方式:
- 安裝并配置 NTP(Network Time Protocol)服務(wù),使服務(wù)器時間與標(biāo)準(zhǔn)時間同步。
安裝命令:
- 安裝 NTP 服務(wù)(以Ubuntu為例):
apt-get install ntp - 啟動 NTP 服務(wù):
service ntp start
說明:
時間同步是為了確保數(shù)據(jù)庫服務(wù)器與其他服務(wù)器和客戶端之間的時間一致性。
MySQL的許多功能和日志記錄都依賴于準(zhǔn)確的時間。通過安裝和配置NTP服務(wù),可以使數(shù)據(jù)庫服務(wù)器與標(biāo)準(zhǔn)時間源進(jìn)行同步,避免因時間不同步而導(dǎo)致的數(shù)據(jù)問題。
以上是在操作系統(tǒng)層面對MySQL進(jìn)行優(yōu)化的一些常見配置項。請注意,具體的配置可能因操作系統(tǒng)版本和發(fā)行版而異。在進(jìn)行配置時,建議參考官方文檔和操作系統(tǒng)的最佳實踐指南,并根據(jù)實際需求進(jìn)行適當(dāng)?shù)恼{(diào)整。
接下來,我們繼續(xù)進(jìn)行SQL層面的查詢優(yōu)化。
查詢優(yōu)化
進(jìn)行查詢優(yōu)化首選需要了解查詢優(yōu)化器,查詢優(yōu)化器是MySQL中的一個關(guān)鍵組件,它負(fù)責(zé)分析查詢語句并生成最優(yōu)的查詢執(zhí)行計劃。
查詢優(yōu)化器根據(jù)查詢的復(fù)雜度、表的統(tǒng)計信息和索引等因素,評估不同的執(zhí)行計劃,并選擇代價最低的執(zhí)行計劃來執(zhí)行查詢。
查詢優(yōu)化器的工作原理和相關(guān)概念如下:
查詢優(yōu)化器的工作流程:
- 解析查詢語句:查詢優(yōu)化器首先會對查詢語句進(jìn)行解析,將其轉(zhuǎn)化為內(nèi)部的查詢樹或邏輯表達(dá)式。
- 查詢重寫:優(yōu)化器可能對查詢進(jìn)行重寫,以優(yōu)化查詢結(jié)構(gòu)和查詢條件。
- 查詢優(yōu)化:優(yōu)化器根據(jù)統(tǒng)計信息、索引和其他相關(guān)信息,生成不同的執(zhí)行計劃,并評估每個執(zhí)行計劃的代價。
- 選擇最優(yōu)執(zhí)行計劃:優(yōu)化器選擇代價最低的執(zhí)行計劃,并生成執(zhí)行計劃的執(zhí)行指令。
- 執(zhí)行查詢:MySQL的執(zhí)行引擎根據(jù)優(yōu)化器生成的執(zhí)行計劃,執(zhí)行查詢并返回結(jié)果。
查詢優(yōu)化器的優(yōu)化過程:
- 查詢預(yù)估:優(yōu)化器根據(jù)統(tǒng)計信息和查詢條件預(yù)估查詢結(jié)果集的大小,以決定使用哪個執(zhí)行計劃。
- 索引選擇:優(yōu)化器根據(jù)索引的選擇性和列的選擇性,決定是否使用索引以及使用哪個索引。
- 連接順序選擇:對于涉及多個表的查詢,優(yōu)化器選擇合適的表連接順序,以減少中間結(jié)果集的大小和連接操作的代價。
- 子查詢優(yōu)化:優(yōu)化器嘗試將子查詢轉(zhuǎn)化為連接操作或應(yīng)用優(yōu)化的技術(shù),以減少子查詢的執(zhí)行次數(shù)和開銷。
- 重寫查詢:優(yōu)化器可能對查詢進(jìn)行重寫,使用等價的查詢結(jié)構(gòu),以改進(jìn)查詢的執(zhí)行效率。
統(tǒng)計信息的使用:
- 表統(tǒng)計信息:優(yōu)化器使用表的統(tǒng)計信息,如行數(shù)、列的唯一值數(shù)量等,來估計查詢的選擇性和代價。
- 索引統(tǒng)計信息:優(yōu)化器使用索引的統(tǒng)計信息,如索引的選擇性、平均數(shù)據(jù)頁的大小等,來評估索引的使用代價。
- 更新統(tǒng)計信息:統(tǒng)計信息會隨著數(shù)據(jù)的變化而變化,優(yōu)化器可能需要定期更新統(tǒng)計信息,以保持查詢優(yōu)化的準(zhǔn)確性。
查詢優(yōu)化器的影響因素:
- 查詢復(fù)雜度:查詢的復(fù)雜度越高,優(yōu)化器需要考慮的執(zhí)行計劃越多,優(yōu)化的時間和代價也會增加。
- 數(shù)據(jù)分布:數(shù)據(jù)的分布情況會影響優(yōu)化器的索引選擇和連接順序的決策,不同的數(shù)據(jù)分布可能導(dǎo)致不同的執(zhí)行計劃。
只有了解查詢優(yōu)化器的涉及邏輯,才能更好的掌握查詢優(yōu)化的相關(guān)方法。
查詢優(yōu)化主要手段
SQL查詢優(yōu)化涉及到多個方面,以下是一些常見的SQL查詢優(yōu)化技術(shù)和相關(guān)方面的詳細(xì)描述:
優(yōu)化查詢語句:
- 使用恰當(dāng)?shù)腟QL語句:根據(jù)查詢需求選擇合適的SQL語句,避免冗余或復(fù)雜的查詢操作。
- 減少數(shù)據(jù)返回量:只選擇需要的列,避免返回不必要的數(shù)據(jù),減少網(wǎng)絡(luò)傳輸和結(jié)果集處理開銷。
優(yōu)化數(shù)據(jù)模型和表結(jié)構(gòu):
- 正規(guī)化數(shù)據(jù)模型:遵循數(shù)據(jù)庫設(shè)計的規(guī)范,消除數(shù)據(jù)冗余,提高查詢效率。
- 合理劃分表和分區(qū):將大表劃分為更小的表或使用分區(qū)技術(shù),提高查詢效率和數(shù)據(jù)維護(hù)性能。
監(jiān)測和分析查詢性能:
- 使用性能監(jiān)控工具:監(jiān)測數(shù)據(jù)庫的性能指標(biāo),如查詢響應(yīng)時間、鎖等待時間等,及時發(fā)現(xiàn)性能瓶頸。
- 分析執(zhí)行計劃:使用EXPLAIN語句分析查詢的執(zhí)行計劃,查看索引使用情況和性能瓶頸,優(yōu)化查詢語句和索引設(shè)計。
定期維護(hù)和優(yōu)化:
- 定期收集統(tǒng)計信息:通過收集表的統(tǒng)計信息,優(yōu)化查詢優(yōu)化器的決策,提高查詢計劃的準(zhǔn)確性和性能。
- 定期重建索引:當(dāng)索引碎片化嚴(yán)重時,定期重建索引,提高索引的效率。
SQL查詢優(yōu)化是一個綜合性的工作,需要綜合考慮數(shù)據(jù)庫結(jié)構(gòu)、索引設(shè)計、查詢語句、系統(tǒng)配置等多個方面。通過不斷優(yōu)化查詢性能,可以提高數(shù)據(jù)庫的響應(yīng)速度和系統(tǒng)的整體性能。
電商場景案例實戰(zhàn)
準(zhǔn)備工作
在進(jìn)行實戰(zhàn)案例演示前,我們需要準(zhǔn)備相關(guān)數(shù)據(jù),
我們都知道,在電商平臺中,最核心的數(shù)據(jù)為:用戶、商品、訂單,
因此,我們需要創(chuàng)建了對應(yīng)三張表,以及批量初始化大量數(shù)據(jù),
其中,表結(jié)構(gòu)簡單設(shè)計如下:
CREATE TABLE `my_customer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL DEFAULT "" COMMENT "姓名", `age` int(3) DEFAULT "20" COMMENT "年齡", `gender` tinyint(1) NOT NULL DEFAULT "0" COMMENT "性別 0-女 1-男", `phone` varchar(20) DEFAULT "" COMMENT "地址", `address` varchar(100) DEFAULT NULL, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `my_customer_name_IDX` (`name`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="客戶";CREATE TABLE `my_order` ( `id` int(11) NOT NULL AUTO_INCREMENT, `customer_id` int(11) NOT NULL, `product_id` int(11) NOT NULL, `quantity` int(11) NOT NULL DEFAULT "1" COMMENT "數(shù)量", `total_price` int(11) NOT NULL DEFAULT "1" COMMENT "總價", `order_status` smallint(5) unsigned NOT NULL DEFAULT "0" COMMENT "訂單狀態(tài) 0-未支付 1-已支付 2-派送中 3-已簽收", `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="訂單";CREATE TABLE `my_product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL COMMENT "商品名", `type` int(11) NOT NULL DEFAULT "1" COMMENT "類型 1-衣服 2-食品 3-書籍", `brand` varchar(100) DEFAULT "" COMMENT "品牌", `shop_id` int(11) NOT NULL DEFAULT "1" COMMENT "店鋪ID", `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT="商品";其中,用戶數(shù)據(jù)量為100萬,商品數(shù)據(jù)量10萬,訂單數(shù)據(jù)量近千萬。
接下來, 我們根據(jù)實際電商平臺常見查詢場景進(jìn)行分析和優(yōu)化。
場景1:用戶搜索
電商后臺管理系統(tǒng)通常需要根據(jù)用戶名稱、手機(jī)號、地址搜索相關(guān)用戶信息,
常見的查詢SQL語句如下:
select * from `my_customer` where phone like "%176%"我們利用explain 分析下該sql語句的執(zhí)行過程。
MySQL 的 EXPLAIN是一個非常有用的工具,它可以分析和解釋查詢語句的執(zhí)行計劃,幫助開發(fā)者優(yōu)化查詢性能。通過執(zhí)行 EXPLAIN命令,可以獲取查詢執(zhí)行計劃的詳細(xì)信息,包括以下字段:
id: 查詢的唯一標(biāo)識符,用于標(biāo)識每個查詢的不同步驟或子查詢。select_type: 查詢類型,表示查詢的類型和方式,常見的取值包括:SIMPLE: 簡單查詢,不包含子查詢或聯(lián)接。PRIMARY: 外層查詢。SUBQUERY: 子查詢。DERIVED: 派生表的查詢。UNION: UNION 查詢。UNION RESULT: UNION 查詢的結(jié)果。DEPENDENT UNION: 依賴于外部查詢的 UNION 查詢。UNION RESULT: UNION 查詢的結(jié)果。DEPENDENT UNION: 依賴于外部查詢的 UNION 查詢。UNION RESULT: UNION 查詢的結(jié)果。DEPENDENT UNION: 依賴于外部查詢的 UNION 查詢。
table: 表名,表示查詢涉及的表名或表的別名。partitions: 分區(qū)信息,如果查詢涉及到分區(qū)表,則顯示分區(qū)信息。type: 訪問類型,表示查詢使用的訪問方法和算法,常見的取值包括:ALL: 全表掃描,需要掃描整個表。index: 只訪問索引,無需掃描表數(shù)據(jù)。range: 使用索引范圍進(jìn)行查詢。ref: 使用非唯一索引或唯一索引前綴進(jìn)行查詢。eq_ref: 使用唯一索引進(jìn)行等值查詢。const: 常量查詢,使用常量值進(jìn)行查詢。system: 系統(tǒng)表查詢。NULL: 無效或未知的查詢類型。
possible_keys: 可能使用的索引,表示查詢可能使用的索引列表。key: 實際使用的索引,表示查詢實際使用的索引。key_len: 使用索引的長度,表示索引中使用的字節(jié)數(shù)。ref: 連接條件,表示連接使用的列或常量。rows: 估計的行數(shù),表示查詢掃描的行數(shù)估計值。filtered: 過濾的行百分比,表示查詢結(jié)果中實際返回的行數(shù)百分比。Extra: 額外信息,表示查詢的附加信息,可能包括排序、臨時表、使用的文件等。
通過分析 EXPLAIN的輸出結(jié)果,可以了解查詢的執(zhí)行計劃、訪問方法和可能存在的性能問題。可以根據(jù)輸出結(jié)果中的字段信息,優(yōu)化查詢語句、索引設(shè)計和數(shù)據(jù)庫配置,以提高查詢性能和效率。
mysql> explain select * from `my_customer` where phone like "%157%";+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+-------------+| 1 | SIMPLE | my_customer | NULL | ALL | NULL | NULL | NULL | NULL | 995164 | 11.11 | Using where |+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+-------------+1 row in set, 1 warning (0.00 sec)我們可以看到該sql語句的執(zhí)行計劃中,type字段為ALL , 表示全表掃描,這會導(dǎo)致查詢效率過低,耗時過長。
首先我們應(yīng)該考慮為查詢字段加上索引,例如phone字段。
mysql> CREATE INDEX my_customer_phone_IDX USING BTREE ON store.my_customer (phone);這里要注意,模糊匹配查詢使用 %在開頭會導(dǎo)致索引失效。
可以嘗試將查詢條件改為以 %結(jié)尾的模糊匹配,例如
select * from `my_customer` where phone like "157%";接下來使用explain命令再次查看執(zhí)行計劃:
mysql> explain select * from `my_customer` where phone like "157%";+----+-------------+-------------+------------+-------+-----------------------+-----------------------+---------+------+--------+----------+-----------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------------+------------+-------+-----------------------+-----------------------+---------+------+--------+----------+-----------------------+| 1 | SIMPLE | my_customer | NULL | range | my_customer_phone_IDX | my_customer_phone_IDX | 83 | NULL | 103520 | 100.00 | Using index condition |+----+-------------+-------------+------------+-------+-----------------------+-----------------------+---------+------+--------+----------+-----------------------+1 row in set, 1 warning (0.00 sec)我們可以看到sql執(zhí)行過程中實際用到了my_customer_phone_IDX 索引, 相比全表掃描,這里預(yù)計掃描函數(shù)僅10w多行。
在實際開發(fā)過程中,應(yīng)該避免使用 SELECT *:只選擇需要的字段,而不是使用通配符 *。只選擇必要的字段可以減少數(shù)據(jù)傳輸和內(nèi)存開銷,提高查詢性能。
例如,我們僅需要根據(jù)用戶手機(jī)號查詢用戶id和姓名,
那么,sql應(yīng)該改寫如下:
select id, name from `my_customer` where phone like "157%";那么到這里,當(dāng)前sql語句能否進(jìn)一步優(yōu)化呢?
答案是肯定的,
首先我們要了解下回表查詢這個概念,
回表查詢是指在使用非覆蓋索引(Non-Clustered Index)進(jìn)行查詢時,當(dāng)需要獲取查詢結(jié)果所需的數(shù)據(jù)列不在索引中時,MySQL 需要通過索引的指針回到主索引(Clustered Index)或數(shù)據(jù)頁中獲取缺失的數(shù)據(jù)列。
在回表查詢中,首先根據(jù)非覆蓋索引定位到符合查詢條件的索引記錄,然后通過索引中的指針獲取主索引或數(shù)據(jù)頁中的相應(yīng)數(shù)據(jù)列。這個過程涉及了兩次磁盤訪問,即首先訪問索引頁,再次訪問主索引或數(shù)據(jù)頁,因此相對于覆蓋索引的查詢,回表查詢會引入額外的磁盤讀取操作,增加了查詢的開銷和響應(yīng)時間。
回表查詢可能會對查詢性能產(chǎn)生一定的影響,特別是在大數(shù)據(jù)量和高并發(fā)查詢的情況下。因此,為了減少回表查詢的開銷,可以考慮通過覆蓋索引(Covering Index)來進(jìn)行優(yōu)化,
覆蓋索引(Covering Index)是指在查詢過程中,索引包含了查詢所需的所有數(shù)據(jù)列,無需回表查詢主索引或數(shù)據(jù)頁。換句話說,覆蓋索引能夠直接提供查詢所需的數(shù)據(jù),而不需要再去訪問主索引或數(shù)據(jù)頁,從而提高查詢性能和效率。
在一般的索引中,只包含了被索引的列以及主索引的引用指針。當(dāng)執(zhí)行查詢時,MySQL 首先通過索引定位到符合條件的記錄,然后再通過主索引或數(shù)據(jù)頁獲取缺失的數(shù)據(jù)列,這個過程被稱為回表查詢。而覆蓋索引則避免了回表查詢的開銷,因為索引本身就包含了查詢所需的所有數(shù)據(jù)列。
覆蓋索引的好處主要體現(xiàn)在以下幾個方面:
提高查詢性能:由于覆蓋索引能夠直接提供查詢所需的數(shù)據(jù),減少了磁盤的隨機(jī)訪問和額外的回表查詢操作,從而加快了查詢的執(zhí)行速度。
減少磁盤 I/O:回表查詢需要進(jìn)行額外的磁盤讀取操作,而覆蓋索引可以減少磁盤 I/O 操作,降低系統(tǒng)的磁盤負(fù)載。
減少內(nèi)存消耗:覆蓋索引可以減少需要加載到內(nèi)存中的數(shù)據(jù)量,節(jié)省了內(nèi)存的使用,提高了查詢的效率。
要創(chuàng)建覆蓋索引,需要選擇適當(dāng)?shù)乃饕?,以包含查詢語句中涉及的所有列。這需要綜合考慮查詢的需求、數(shù)據(jù)列的選擇性和索引的大小等因素。需要注意的是,創(chuàng)建過多的覆蓋索引可能會增加索引的維護(hù)成本和存儲空間占用。
總之,覆蓋索引是一種優(yōu)化手段,通過索引包含查詢所需的所有數(shù)據(jù)列,避免了回表查詢,提高了查詢的性能和效率。使用覆蓋索引可以在適當(dāng)?shù)那闆r下優(yōu)化查詢,但需要權(quán)衡索引的設(shè)計和維護(hù)成本。
這里,我們重新創(chuàng)建my_customer_phone_IDX索引,腳本如下:
CREATE INDEX my_customer_phone_IDX USING BTREE ON store.my_customer (phone,name);重新使用explain命令再次查看執(zhí)行計劃:
mysql> explain select id, name from `my_customer` where phone like "157%";+----+-------------+-------------+------------+-------+-----------------------+-----------------------+---------+------+--------+----------+--------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------------+------------+-------+-----------------------+-----------------------+---------+------+--------+----------+--------------------------+| 1 | SIMPLE | my_customer | NULL | range | my_customer_phone_IDX | my_customer_phone_IDX | 83 | NULL | 100018 | 100.00 | Using where; Using index |+----+-------------+-------------+------------+-------+-----------------------+-----------------------+---------+------+--------+----------+--------------------------+1 row in set, 1 warning (0.00 sec)這里,我們可以看到Extra字段的值包含Using index, 表明觸發(fā)了索引覆蓋,沒有進(jìn)行回表查詢,查詢時間大大減少。
同理,如果SQL如下,
select count(name) from `my_customer` where phone like "157%";覆蓋索引也會生效。
場景2:訂單查詢
不管是用戶App端還是在電商后臺,都存在訂單查詢的場景,
例如我們需要根據(jù)品牌查詢對應(yīng)品牌下商品的訂單,
我們首先給商品表加個以品牌字段作為索引:
CREATE INDEX my_product_brand_IDX USING BTREE ON store.my_product (brand);我們先給出一條常見的查詢SQL:
select * from my_order mo where product_id in (select id from my_product mp where brand = "Apple");sql查詢耗時近6000ms, 查看執(zhí)行計劃:
mysql> explain select * from my_order mo where product_id in (select id from my_product mp where brand = "Apple");+----+-------------+-------+------------+--------+------------------------------+---------+---------+---------------------+---------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+--------+------------------------------+---------+---------+---------------------+---------+----------+-------------+| 1 | SIMPLE | mo | NULL | ALL | NULL | NULL | NULL | NULL | 7529130 | 100.00 | NULL || 1 | SIMPLE | mp | NULL | eq_ref | PRIMARY,my_product_brand_IDX | PRIMARY | 4 | store.mo.product_id | 1 | 5.00 | Using where |+----+-------------+-------+------------+--------+------------------------------+---------+---------+---------------------+---------+----------+-------------+2 rows in set, 1 warning (0.00 sec)可以看到有兩條執(zhí)行計劃,其中訂單表的查詢使用了全表掃描,
我們再給訂單表的prodcut_id字段加上索引,
CREATE INDEX my_order_product_id_IDX USING BTREE ON store.my_order (product_id);再次查看執(zhí)行計劃:
mysql> explain select * from my_order mo where product_id in (select id from my_product mp where brand = "Apple");+----+-------------+-------+------------+------+------------------------------+-------------------------+---------+-------------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+------------------------------+-------------------------+---------+-------------+------+----------+-------------+| 1 | SIMPLE | mp | NULL | ref | PRIMARY,my_product_brand_IDX | my_product_brand_IDX | 403 | const | 1027 | 100.00 | Using index || 1 | SIMPLE | mo | NULL | ref | my_order_product_id_IDX | my_order_product_id_IDX | 4 | store.mp.id | 75 | 100.00 | NULL |+----+-------------+-------+------------+------+------------------------------+-------------------------+---------+-------------+------+----------+-------------+2 rows in set, 1 warning (0.00 sec)這里,我們可以看到兩條計劃都用到了prodcut_id字段索引,加快了查詢效率。
雖然子查詢在當(dāng)前情況下實現(xiàn)了查詢需求,但使用子查詢可能會導(dǎo)致一些性能問題,因此在優(yōu)化查詢時,通常不建議過度依賴子查詢。以下是一些原因:
執(zhí)行多次查詢:效率太差,執(zhí)行子查詢時,MYSQL需要創(chuàng)建臨時表,查詢完畢后再刪除這些臨時表,所以,子查詢的速度會受到一定的影響,這里多了一個創(chuàng)建和銷毀臨時表的過程。
可讀性和維護(hù)性差:復(fù)雜的嵌套子查詢可能會使查詢語句變得難以理解和維護(hù)。子查詢通常需要理解嵌套層次和各個子查詢之間的關(guān)系,使查詢語句變得冗長且難以閱讀。
缺乏優(yōu)化靈活性:數(shù)據(jù)庫優(yōu)化器在處理子查詢時的優(yōu)化能力相對較弱。優(yōu)化器很難對復(fù)雜的嵌套子查詢進(jìn)行全面的優(yōu)化,可能無法選擇最佳執(zhí)行計劃,導(dǎo)致性能下降。
可能引發(fā)性能問題:子查詢可能導(dǎo)致全表掃描或臨時表的創(chuàng)建,增加系統(tǒng)的 I/O 負(fù)擔(dān)和內(nèi)存消耗。特別是當(dāng)子查詢涉及大量數(shù)據(jù)或涉及多表關(guān)聯(lián)時,性能問題可能更加明顯。
對于能夠使用連接查詢(JOIN)或其他更有效方法替代的子查詢,通常建議使用更簡潔和高效的查詢方式。連接查詢可以更好地利用索引和優(yōu)化執(zhí)行計劃,同時提供更好的可讀性和維護(hù)性。
然而,并非所有情況下都不推薦使用子查詢。在某些特定的場景下,子查詢是合理的選擇,例如需要進(jìn)行存在性檢查或在查詢中嵌套聚合函數(shù)等情況。在使用子查詢時,需要根據(jù)實際情況綜合考慮性能、可讀性和維護(hù)性的權(quán)衡,確保達(dá)到最佳的查詢效果。
這里,我們應(yīng)該將SQL語句改寫為連接查詢(JOIN),
SELECT mo.id as orderId, mo.customer_id as customerId, mp.name as productName, mo.order_status as orderStatus FROM my_order mo JOIN my_product mp ON mo.product_id = mp.id WHERE mp.brand = "Apple";雖然多表連接查詢(多表 JOIN)是常見的查詢方式之一,但是一旦join涉及到的數(shù)據(jù)量很大效率就很難保證,這種情況下強(qiáng)烈推薦分別根據(jù)索引單表取數(shù)據(jù),然后在應(yīng)用層里面做join,merge數(shù)據(jù)。
在應(yīng)用層關(guān)聯(lián)的優(yōu)勢如下:
提高緩存效率:應(yīng)用程序可以方便地緩存單表查詢的結(jié)果對象。通過拆分關(guān)聯(lián)查詢,當(dāng)關(guān)聯(lián)表中的數(shù)據(jù)發(fā)生變化時,不會影響到查詢緩存,從而提高緩存的效率。
減少鎖競爭:拆分查詢可以減少鎖的競爭。執(zhí)行單個查詢時,只涉及到單個表,減少了鎖的沖突,提高了并發(fā)性能。
易于數(shù)據(jù)庫拆分:在應(yīng)用層進(jìn)行關(guān)聯(lián)查詢,更容易實現(xiàn)數(shù)據(jù)庫的拆分,提供高性能和可擴(kuò)展性的能力。
提升查詢效率:使用 IN() 替代關(guān)聯(lián)查詢時,MySQL可以按照 ID 的順序進(jìn)行查詢,這可能比隨機(jī)的關(guān)聯(lián)查詢更高效。
減少冗余記錄查詢:應(yīng)用層關(guān)聯(lián)查詢意味著每條記錄只需要查詢一次,而在數(shù)據(jù)庫中進(jìn)行關(guān)聯(lián)查詢可能需要重復(fù)訪問部分?jǐn)?shù)據(jù)。因此,這種重構(gòu)還可以減少網(wǎng)絡(luò)和內(nèi)存的開銷。
哈希關(guān)聯(lián)效率更高:應(yīng)用層關(guān)聯(lián)相當(dāng)于在應(yīng)用中實現(xiàn)了哈希關(guān)聯(lián),而不是使用MySQL的嵌套循環(huán)關(guān)聯(lián)。在某些場景下,哈希關(guān)聯(lián)的效率要高得多。
反之不推薦使用 JOIN 的原因:
- 大規(guī)模表的性能壓力:當(dāng)表的數(shù)據(jù)量達(dá)到百萬級別時,使用 JOIN 可能導(dǎo)致性能下降。
- 分布式分庫分表:跨庫 JOIN 不推薦使用,因為目前MySQL的分布式中間件對跨庫 JOIN 的支持不佳。
- 表結(jié)構(gòu)修改的復(fù)雜性:修改單表查詢相對容易,而修改 JOIN 的 SQL 語句較為復(fù)雜,維護(hù)成本較高。
當(dāng)然join在部分場景使用也有好處,
例如分頁查詢:JOIN 查詢可以方便地進(jìn)行分頁,可以使用副表的字段作為查詢條件,在查詢時將副表的匹配字段作為結(jié)果集,使用主表進(jìn)行 IN() 查詢。
場景3:分頁查詢
那么接下來,我們再看看分頁查詢情況下的優(yōu)化:
一般典型分頁查詢語句如下:
SELECT mo.id as orderId, mo.customer_id as customerId, mo.order_status as orderStatus FROM my_order mo where mo.order_status = 1 order by mo.id asc limit 1000000, 10limit是最常用的分頁方法,它在執(zhí)行過程中,相當(dāng)于先遍歷了前1000000個,然后取了第1000000到1000010個,舍棄了前1000000個, limit越大查詢性能越低,limit僅適用于小數(shù)據(jù)范圍內(nèi)的分頁查詢。
mysql> explain SELECT mo.id as orderId, mo.customer_id as customerId, mo.order_status as orderStatus FROM my_order mo where mo.order_status = 1 order by mo.id asc limit 1000000, 10;+----+-------------+-------+------------+-------+---------------+---------+---------+------+---------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+---------+---------+------+---------+----------+-------------+| 1 | SIMPLE | mo | NULL | index | NULL | PRIMARY | 4 | NULL | 1000010 | 10.00 | Using where |+----+-------------+-------+------------+-------+---------------+---------+---------+------+---------+----------+-------------+1 row in set, 1 warning (0.00 sec)那么我們應(yīng)該怎么優(yōu)化呢?
我們可以利用索引來進(jìn)行優(yōu)化,例如我們分頁查詢到第1000000條數(shù)據(jù),訂單ID為3997806,那么下個分頁的所有訂單ID都是大于3997806,
sql語句可以改寫為:
SELECT mo.id as orderId, mo.customer_id as customerId, mo.order_status as orderStatus FROM my_order mo inner join (select id from my_order where id > 3997806 and order_status = 1 limit 100) mo2 on mo.id = mo2.id order by mo.id ascsql語句的執(zhí)行從10s降低到100ms,提升近100倍,
我們可以看下執(zhí)行計劃,
mysql> explain SELECT mo.id as orderId, mo.customer_id as customerId, mo.order_status as orderStatus FROM my_order mo inner join (select id from my_order where id > 3997806 and order_status = 1 limit 100) mo2 on mo.id = mo2.id order by mo.id asc -> ;+----+-------------+------------+------------+--------+---------------+---------+---------+--------+---------+----------+---------------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+------------+------------+--------+---------------+---------+---------+--------+---------+----------+---------------------------------+| 1 | PRIMARY | | NULL | ALL | NULL | NULL | NULL | NULL | 100 | 100.00 | Using temporary; Using filesort || 1 | PRIMARY | mo | NULL | eq_ref | PRIMARY | PRIMARY | 4 | mo2.id | 1 | 100.00 | NULL || 2 | DERIVED | my_order | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 3764565 | 10.00 | Using where |+----+-------------+------------+------------+--------+---------------+---------+---------+--------+---------+----------+---------------------------------+3 rows in set, 1 warning (0.00 sec) 從查詢計劃我們看到,首先子查詢根據(jù)主鍵索引,獲取最多10條訂單ID, 然后再根據(jù)這10條id 獲取數(shù)據(jù)詳情。不需要再查詢上百萬條數(shù)據(jù)后排序取所需幾行數(shù)據(jù)。
場景4:訂單統(tǒng)計報表查詢
接下來,我們在看下第4個場景,訂單統(tǒng)計。
電商平臺經(jīng)常需要從多個維度統(tǒng)計訂單數(shù)據(jù),例如訂單數(shù)、訂單總額、熱門商品排行等等。
這里假設(shè)我們需要查詢不同商品的訂單數(shù)和訂單總額,
給出的第一版sql 如下所示:
select mo.product_id , count(*) as num , sum(mo.total_price) from my_order mo group by mo.product_id 執(zhí)行部分情況如下:
| 99995 | 65 | 21528 || 99996 | 85 | 24549 || 99997 | 75 | 23156 || 99998 | 89 | 27123 || 99999 | 90 | 24190 || 100000 | 79 | 26625 |+------------+-----+---------------------+100000 rows in set (1 min 48.82 sec)10000個商品耗時到達(dá)了48秒多,
對于分組統(tǒng)計查詢,以下是一些優(yōu)化思路:
使用合適的索引:為支持分組和統(tǒng)計操作,可以考慮創(chuàng)建合適的索引。優(yōu)化思路包括:
- 為分組字段和統(tǒng)計字段創(chuàng)建索引,以提高分組和聚合操作的效率。
- 考慮覆蓋索引,即索引包含所有需要的字段,避免回表查詢。
- 針對不同的查詢場景和條件,選擇適當(dāng)?shù)乃饕愋停ㄈ鏐-tree索引、哈希索引等)。
緩存結(jié)果集:對于頻繁進(jìn)行的分組統(tǒng)計查詢,可以考慮緩存結(jié)果集,避免每次都重新計算。優(yōu)化思路包括:
- 使用緩存技術(shù)(如Redis)存儲結(jié)果集,以便快速獲取統(tǒng)計數(shù)據(jù)。
- 設(shè)置合適的緩存失效策略,根據(jù)數(shù)據(jù)的更新頻率進(jìn)行定期更新或手動更新。
預(yù)聚合數(shù)據(jù):對于大數(shù)據(jù)量和復(fù)雜的統(tǒng)計查詢,可以考慮預(yù)先計算和存儲聚合結(jié)果,以減少查詢時的計算量。優(yōu)化思路包括:
- 創(chuàng)建定期或?qū)崟r的預(yù)聚合任務(wù),將統(tǒng)計結(jié)果存儲到特定的表中。
- 在查詢時直接從預(yù)聚合表中獲取結(jié)果,避免重復(fù)的計算和分組操作。
合理設(shè)置分組字段:對于分組統(tǒng)計查詢,分組字段的選擇會影響查詢性能。優(yōu)化思路包括:
- 盡量選擇具有高基數(shù)(不同取值較多)的字段作為分組字段,以減少分組的數(shù)量和計算量。
- 避免在查詢中使用過多復(fù)雜的表達(dá)式或函數(shù)作為分組字段,以減少計算的開銷。
考慮并行計算:對于大規(guī)模數(shù)據(jù)的分組統(tǒng)計查詢,可以考慮使用并行計算來提高查詢效率。優(yōu)化思路包括:
- 將查詢?nèi)蝿?wù)拆分為多個并行的子任務(wù),每個子任務(wù)處理不同的數(shù)據(jù)子集。
- 使用并行計算框架或數(shù)據(jù)庫引擎支持并行查詢,以加快查詢速度和提高吞吐量。
當(dāng)然具體的優(yōu)化策略需要根據(jù)具體的業(yè)務(wù)場景和數(shù)據(jù)特點進(jìn)行選擇和調(diào)整。
因為我們在之前的場景案例里,已經(jīng)對product_id 字段加了索引,我們可以根據(jù)第三條和第五條優(yōu)化建議:并行計算,在應(yīng)用層聚合數(shù)據(jù),
考慮每條sql僅對部分商品進(jìn)行統(tǒng)計,例如:
select mo.product_id , count(*) as num , sum(mo.total_price) from my_order mo where mo.product_id between 1000 and 2000 group by mo.product_id;這里僅對商品ID在(1000,2000)范圍內(nèi)的訂單進(jìn)行統(tǒng)計,我們可以分多次查詢不同的數(shù)據(jù)。
使用分段統(tǒng)計后,我們可以看下執(zhí)行效率,
| 1997 | 91 | 27524 || 1998 | 54 | 14298 || 1999 | 74 | 24560 || 2000 | 68 | 23343 |+------------+-----+---------------------+1001 rows in set (1.26 sec)mysql> explain select mo.product_id , count(*) as num , sum(mo.total_price) from my_order mo where mo.product_id between 1000 and 2000 group by mo.product_id;+----+-------------+-------+------------+-------+-------------------------+-------------------------+---------+------+--------+----------+-----------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+-------------------------+-------------------------+---------+------+--------+----------+-----------------------+| 1 | SIMPLE | mo | NULL | range | my_order_product_id_IDX | my_order_product_id_IDX | 4 | NULL | 147998 | 100.00 | Using index condition; Using temporary; Using filesort |+----+-------------+-------+------------+-------+-------------------------+-------------------------+---------+------+--------+----------+-----------------------+1 row in set, 1 warning (0.00 sec)可以看到這里采用了my_order_product_id_IDX索引加快查詢,另外由于數(shù)據(jù)量的減少,進(jìn)行排序和統(tǒng)計的耗時也大大減少。
另外在執(zhí)行計劃里,Extra字段中包含Using filesort值, 這表明在分組的過程中,還默認(rèn)用到了排序,
如果不需要排序,我們應(yīng)該顯示聲明,修改SQL如下所示:
select mo.product_id , count(*) as num , sum(mo.total_price) from my_order mo where mo.product_id between 1000 and 2000 group by mo.product_id order by nullMySQL性能監(jiān)控與報警
MySQL性能監(jiān)控和報警是保證數(shù)據(jù)庫運行穩(wěn)定性和性能優(yōu)化的關(guān)鍵步驟。它可以幫助我們實時監(jiān)控數(shù)據(jù)庫的各項指標(biāo),并在異常情況發(fā)生時及時發(fā)出警報,以便及時采取措施進(jìn)行故障排查和性能優(yōu)化。
以下是一些常用的MySQL性能監(jiān)控指標(biāo)、工具和使用說明:
監(jiān)控指標(biāo):
- 查詢性能:包括慢查詢、查詢響應(yīng)時間、查詢吞吐量等。
- 連接和并發(fā)性能:包括并發(fā)連接數(shù)、線程池使用情況、連接請求等。
- 緩存命中率:包括查詢緩存、InnoDB緩沖池的命中率。
- 鎖等待和死鎖情況:包括鎖等待時間、死鎖次數(shù)等。
- 磁盤IO性能:包括讀寫速度、磁盤利用率、IO等待時間等。
- 主從復(fù)制狀態(tài):包括延遲時間、同步狀態(tài)等。
監(jiān)控工具:
- MySQL Enterprise Monitor:官方提供的商業(yè)監(jiān)控工具,提供全面的性能監(jiān)控和警報功能。
- Percona Monitoring and Management (PMM):一個免費開源的MySQL監(jiān)控和管理工具,提供豐富的性能指標(biāo)和警報功能。
- Nagios:一個廣泛使用的開源監(jiān)控工具,可以通過插件擴(kuò)展來監(jiān)控MySQL的各項指標(biāo)。
- Zabbix:另一個開源的監(jiān)控工具,支持MySQL的性能監(jiān)控和警報功能。
- Prometheus:一個開源的系統(tǒng)監(jiān)控和警報工具,可以通過插件或Exporter來監(jiān)控MySQL的性能指標(biāo)。
使用說明:
- 配置監(jiān)控工具:根據(jù)所選的監(jiān)控工具,按照其文檔進(jìn)行安裝和配置,包括指定要監(jiān)控的MySQL實例和設(shè)置警報閾值。
- 選擇合適的指標(biāo):根據(jù)實際需求和關(guān)注點,選擇需要監(jiān)控的指標(biāo),并設(shè)置適當(dāng)?shù)木瘓箝撝怠?/li>
- 定期收集和分析數(shù)據(jù):監(jiān)控工具會定期收集MySQL的性能數(shù)據(jù),將其存儲在數(shù)據(jù)庫中??梢酝ㄟ^監(jiān)控工具的界面或API來查看和分析數(shù)據(jù)。
- 設(shè)置警報規(guī)則:根據(jù)監(jiān)控工具的規(guī)則設(shè)置功能,設(shè)置合適的警報規(guī)則,當(dāng)指標(biāo)超過閾值時觸發(fā)警報。
- 故障排查和優(yōu)化:當(dāng)收到警報時,及時進(jìn)行故障排查,定位問題并采取相應(yīng)的優(yōu)化措施,如調(diào)整參數(shù)配置、優(yōu)化查詢語句、增加硬件資源等。
- 定期評估和調(diào)整:定期評估數(shù)據(jù)庫性能,并根據(jù)需求進(jìn)行調(diào)整,包括增加監(jiān)控指標(biāo)、調(diào)整警報閾值、優(yōu)化監(jiān)控工具的配置等。
通過綜合使用監(jiān)控工具和合適的指標(biāo),可以實時監(jiān)控MySQL的性能并提前發(fā)現(xiàn)潛在的問題。及時采取措施進(jìn)行故障排查和性能優(yōu)化,可以確保數(shù)據(jù)庫的穩(wěn)定性和高性能運行。
MySQL調(diào)優(yōu)小結(jié)
MySQL調(diào)優(yōu)是一個持續(xù)優(yōu)化的過程,它涉及到多個方面的工作,包括參數(shù)配置、索引優(yōu)化、查詢優(yōu)化和硬件操作系統(tǒng)優(yōu)化等。
在進(jìn)行調(diào)優(yōu)時,需要根據(jù)服務(wù)器的實際配置和應(yīng)用層的需求,綜合考慮各種因素,并結(jié)合實際場景進(jìn)行優(yōu)化。
調(diào)優(yōu)的思路可以總結(jié)為以下幾點:
監(jiān)控和評估:首先,需要對MySQL進(jìn)行監(jiān)控和評估,了解數(shù)據(jù)庫的性能瓶頸和瓶頸原因。通過監(jiān)控工具和性能評估報告,可以識別出慢查詢、高負(fù)載和資源瓶頸等問題。
參數(shù)配置優(yōu)化:根據(jù)監(jiān)控和評估的結(jié)果,針對性地調(diào)整MySQL的參數(shù)配置。合理配置緩沖區(qū)大小、并發(fā)連接數(shù)和查詢緩存等參數(shù),以充分利用系統(tǒng)資源并提高性能。
索引優(yōu)化:通過分析查詢語句和數(shù)據(jù)訪問模式,設(shè)計和優(yōu)化合適的索引。避免創(chuàng)建過多的索引,同時確保關(guān)鍵查詢能夠使用索引加速查詢操作。
查詢優(yōu)化:優(yōu)化查詢語句,避免全表掃描和不必要的連接操作。使用合適的查詢條件、JOIN語句和子查詢等技術(shù)手段,提升查詢性能。
硬件和操作系統(tǒng)優(yōu)化:根據(jù)服務(wù)器的實際配置和操作系統(tǒng)特點,進(jìn)行相應(yīng)的硬件和操作系統(tǒng)優(yōu)化。合理分配內(nèi)存和磁盤空間,優(yōu)化文件系統(tǒng)和網(wǎng)絡(luò)配置,以提高數(shù)據(jù)庫的運行效率。
調(diào)優(yōu)工作需要與服務(wù)器實際配置和應(yīng)用層緊密結(jié)合。不同的應(yīng)用場景和業(yè)務(wù)需求可能需要不同的調(diào)優(yōu)策略和重點關(guān)注的方面。因此,調(diào)優(yōu)過程中需要與應(yīng)用開發(fā)人員密切合作,了解應(yīng)用的特點和需求,以確保調(diào)優(yōu)方案的有效性和可行性。
調(diào)優(yōu)是一個持續(xù)的過程,需要定期監(jiān)控和評估系統(tǒng)性能,并根據(jù)實際情況進(jìn)行優(yōu)化和調(diào)整。不斷地優(yōu)化MySQL數(shù)據(jù)庫,可以提升系統(tǒng)的性能和穩(wěn)定性,為用戶提供更好的體驗和響應(yīng)速度。
《Java 調(diào)優(yōu)圣經(jīng)》迭代計劃
尼恩團(tuán)隊的所有文章和PDF電子書,都是 持續(xù)迭代的模式, 最新版本永遠(yuǎn)是最全的。
尼恩團(tuán)隊結(jié)合資深架構(gòu)經(jīng)驗和行業(yè)案例,給大家梳理一個系列的《Java 調(diào)優(yōu)圣經(jīng)》PDF電子書,包括本文在內(nèi)規(guī)劃的五個部分:
(1) 調(diào)優(yōu)圣經(jīng)1:零基礎(chǔ)精通Jmeter分布式壓測,10Wqps+壓測實操 (已經(jīng)完成)
(2) 調(diào)優(yōu)圣經(jīng)2:從70s到20ms,一次3500倍性能優(yōu)化實戰(zhàn),方案人人可用 (已經(jīng)完成)
(3) 調(diào)優(yōu)圣經(jīng)4:如何做mysql調(diào)優(yōu)?絕命7招讓慢SQL調(diào)優(yōu)100倍,實現(xiàn)你的Mysql調(diào)優(yōu)自由 (本文)
(4) 調(diào)優(yōu)圣經(jīng)3:零基礎(chǔ)精通JVM調(diào)優(yōu)實操,實現(xiàn)JVM自由 (寫作中)
(5) 調(diào)優(yōu)圣經(jīng)5:零基礎(chǔ)精通Linux、Tomcatl調(diào)優(yōu)實操,實現(xiàn)基礎(chǔ)設(shè)施調(diào)優(yōu)自由 (寫作中)
以上的多篇文章,后續(xù)將陸續(xù)在 技術(shù)自由圈 公眾號發(fā)布。 完整的《Java 調(diào)優(yōu)圣經(jīng)》PDF,可以找尼恩獲取。
技術(shù)自由的實現(xiàn)路徑:
實現(xiàn)你的 響應(yīng)式 自由:
《響應(yīng)式圣經(jīng):10W字,實現(xiàn)Spring響應(yīng)式編程自由》
這是老版本 《Flux、Mono、Reactor 實戰(zhàn)(史上最全)》
實現(xiàn)你的 spring cloud 自由:
《Spring cloud Alibaba 學(xué)習(xí)圣經(jīng)》 PDF
《分庫分表 Sharding-JDBC 底層原理、核心實戰(zhàn)(史上最全)》
《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之間混亂關(guān)系(史上最全)》
實現(xiàn)你的 linux 自由:
《Linux命令大全:2W多字,一次實現(xiàn)Linux自由》
實現(xiàn)你的 網(wǎng)絡(luò) 自由:
《TCP協(xié)議詳解 (史上最全)》
《網(wǎng)絡(luò)三張表:ARP表, MAC表, 路由表,實現(xiàn)你的網(wǎng)絡(luò)自由??!》
實現(xiàn)你的 分布式鎖 自由:
《Redis分布式鎖(圖解 - 秒懂 - 史上最全)》
《Zookeeper 分布式鎖 - 圖解 - 秒懂》
實現(xiàn)你的 王者組件 自由:
《隊列之王: Disruptor 原理、架構(gòu)、源碼 一文穿透》
《緩存之王:Caffeine 源碼、架構(gòu)、原理(史上最全,10W字 超級長文)》
《緩存之王:Caffeine 的使用(史上最全)》
《Java Agent 探針、字節(jié)碼增強(qiáng) ByteBuddy(史上最全)》
實現(xiàn)你的 面試題 自由:
4000頁《尼恩Java面試寶典 》 40個專題
獲取11個技術(shù)圣經(jīng)PDF:
相關(guān)稿件
每日動態(tài)!如何做mysql調(diào)優(yōu)?絕命7招,讓慢SQL調(diào)優(yōu)100倍
天天日報丨停航三年今復(fù)航,成都到伊斯坦布爾可直飛了!
交通銀行武漢青山支行被罰100萬元,2名責(zé)任人禁業(yè)10年-當(dāng)前報道
南通文旅消費推廣季啟動,主打親子、研學(xué)、文博游和補貼牌 焦點熱議
因工作調(diào)動,常熟農(nóng)商行副行長尹憲柱辭任
當(dāng)前速看:海信家電(00921)及一系列附屬認(rèn)購合共16.3億元的浦銀理財產(chǎn)品
民生銀行濟(jì)南槐蔭支行:客戶服務(wù)無小事 高效服務(wù)暖人心
恒大地產(chǎn)新增3條被執(zhí)行記錄 執(zhí)行標(biāo)的合計8.4億元 前沿資訊
遠(yuǎn)大醫(yī)藥(00512.HK):牛戰(zhàn)旗辭任執(zhí)行董事
民生證券給予邁得醫(yī)療推薦評級,深度報告:自動化設(shè)備龍頭,隱形眼鏡CDMO邁入新征程 全球快看
抖音發(fā)布新規(guī):嚴(yán)厲打擊仿冒新聞媒體、官方機(jī)構(gòu)行為 世界今日報
全球快訊:海濱街道祥和社區(qū)組織開展端午節(jié)系列活動
【企業(yè)@科創(chuàng)城】貴州睿至:在科創(chuàng)城發(fā)展高地共謀未來
上海海事大學(xué)“優(yōu)質(zhì)生源地”授牌儀式在張掖二中舉行_世界熱議
廣汽集團(tuán)(02238.HK):擬向廣汽三菱提供委托貸款不超過9.42億元_世界觀速訊
航天動力:公司實際控制人為中國航天科技集團(tuán)有限公司,控股股東為航天六院,公司是央企控股上市公司
三棵樹6月20日公司高管趙富煒增持公司股份合計400股_世界焦點
每日原則:別想當(dāng)然地認(rèn)為員工的答案都是正確的-世界速看料
成都錦江區(qū)二季度推進(jìn)重大項目41個 總投資416億元
實施『1344』提升產(chǎn)改整縣試點質(zhì)效 全球新資訊


