更新時(shí)間:2022-04-18 09:16:13 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2021次
MySQL作為最流行的數(shù)據(jù)庫關(guān)系型數(shù)據(jù)庫管理系統(tǒng),仍然需要不時(shí)進(jìn)行優(yōu)化。不僅如此,在大而復(fù)雜的數(shù)據(jù)集的情況下,定期優(yōu)化操作對(duì)于適當(dāng)?shù)南到y(tǒng)性能至關(guān)重要。
MySQL的性能優(yōu)化通常涉及多個(gè)級(jí)別的配置、分析和監(jiān)控性能。要調(diào)整 MySQL 性能,您不一定需要擁有廣泛的專業(yè)知識(shí)和對(duì) SQL 的深刻理解。
在本文中,我們將帶您了解主要的性能調(diào)整技術(shù),以確保您的數(shù)據(jù)庫驅(qū)動(dòng)應(yīng)用程序的穩(wěn)定性、可靠性和速度。
要求
首先要做的是檢查 MySQL 的最佳硬件和軟件要求,尤其是如果您是低端 PC 的所有者,因?yàn)橛布拗瓶赡軙?huì)對(duì)性能產(chǎn)生重大影響。
最低 MySQL 數(shù)據(jù)庫服務(wù)器硬件要求(適用于 5.7 - 8.0 版本):
1Ghz 處理器
512MB 內(nèi)存
硬盤空間取決于數(shù)據(jù)庫的大小
還值得一提的是,如果可能的話,最好使用最新的官方版本的 MySQL。
在硬件層面,您可以采取一系列措施來改善硬件和軟件資源。
磁盤空間
如果您使用傳統(tǒng)硬盤驅(qū)動(dòng)器 (HDD) 并尋求性能增強(qiáng),您應(yīng)該考慮升級(jí)到 SSD。MySQL 官方文檔沒有明確指出有效運(yùn)行 MySQL 服務(wù)器所需的磁盤空間或內(nèi)存設(shè)置,因?yàn)樗鼈冎饕Q于潛在數(shù)據(jù)庫的大小。但是,最好使用sar和iostat系統(tǒng)性能工具來監(jiān)控磁盤性能。如果磁盤使用率明顯高于其他資源的使用率,則絕對(duì)應(yīng)該添加更多存儲(chǔ)空間或升級(jí)到更快的存儲(chǔ)空間。
RAM 內(nèi)存
不足也會(huì)嚴(yán)重影響數(shù)據(jù)庫性能。這可能看起來很陳詞濫調(diào),但如果您的服務(wù)器經(jīng)常在內(nèi)存不足并且 RAM 磁盤性能不令人滿意,則值得添加更多內(nèi)存。當(dāng) RAM 用完時(shí),MySQL 服務(wù)器會(huì)緩存物理內(nèi)存,這會(huì)降低性能。因此,MySQL 內(nèi)存優(yōu)化極為重要。
CPU
MySQL CPU 使用優(yōu)化應(yīng)該從仔細(xì)分析您機(jī)器上發(fā)生的 MySQL 進(jìn)程以及它們所需的處理器使用百分比開始。CPU 升級(jí)并不便宜,但是,如果它是一個(gè)瓶頸,升級(jí)將是必要的。
Internet 連接
網(wǎng)絡(luò)是 MySQL 基礎(chǔ)架構(gòu)的關(guān)鍵部分,跟蹤和分析網(wǎng)絡(luò)流量以確保您有足夠的資源來管理工作負(fù)載非常重要。確保您的 MySQL 服務(wù)器有良好且穩(wěn)定的 Internet 連接以正常運(yùn)行。
正如我們已經(jīng)提到的,您可以在硬件和軟件級(jí)別優(yōu)化 MySQL 性能。現(xiàn)在讓我們看看 MySQL 軟件性能調(diào)優(yōu)。
MySQL 在軟件方面的性能調(diào)優(yōu)涉及到配置 MySQL 服務(wù)器選項(xiàng)、提高 MySQL 查詢性能、調(diào)優(yōu) MySQL 索引、切換到MySQL InnoDB存儲(chǔ)引擎等。讓我們?cè)敿?xì)考慮所有這些。
為提高性能而進(jìn)行適當(dāng)?shù)乃饕⒉蝗菀祝⑶倚枰欢ǔ潭鹊膶I(yè)知識(shí),但它是您可以對(duì)數(shù)據(jù)庫進(jìn)行的最佳性能改進(jìn)之一。
MySQL 使用索引作為書籍索引或路線圖來快速查找給定查詢的值。如果沒有索引,MySQL 將逐行掃描整個(gè)表以查找相關(guān)數(shù)據(jù)。因此,索引優(yōu)化旨在加速數(shù)據(jù)檢索。索引對(duì)用戶不可見,并且包含有關(guān)實(shí)際數(shù)據(jù)存儲(chǔ)位置的信息。還值得注意的是,InnoDB 表的 MySQL 索引長(zhǎng)度有限制,具體取決于行格式。
MySQL 索引對(duì)于大型數(shù)據(jù)集非常有用,如果您的數(shù)據(jù)庫快速增長(zhǎng),索引調(diào)整是正確的做法。索引對(duì)以下操作特別有用:查找與 WHERE 子句匹配的行、使用 JOIN 檢索數(shù)據(jù)、在 ORDER BY 和 GROUP BY 的幫助下進(jìn)行數(shù)據(jù)排序和分組。
那么為什么不插入盡可能多的索引呢?那將是一個(gè)壞主意——不必要的索引會(huì)占用空間并浪費(fèi)系統(tǒng)的時(shí)間,更不用說它們還會(huì)增加查詢的成本,因?yàn)樗饕枰隆K阅惚仨氄业胶线m的平衡點(diǎn)來實(shí)現(xiàn)最優(yōu)的 MySQL 索引使用。
對(duì)于那些數(shù)據(jù)庫負(fù)載很重的人來說,第一個(gè)調(diào)優(yōu)技巧是嘗試從 MyISAM 存儲(chǔ)引擎切換到 InnoDB。與 MyISAM 相比,InnoDB 具有聚集索引,數(shù)據(jù)在頁面和連續(xù)的物理塊中,在處理大量數(shù)據(jù)時(shí)具有更好的性能。
InnoDB 還擁有一組豐富的變量和高級(jí)設(shè)置,可以對(duì)其進(jìn)行配置以進(jìn)一步提高 MySQL 性能。InnoDB 性能設(shè)置更廣泛,因此與調(diào)整 MyISAM 相比,有更多方法可以調(diào)整 InnoDB 以獲得更高的性能。
現(xiàn)在讓我們看看如何優(yōu)化 MySQL 查詢以獲得更好的性能和速度。對(duì)于那些想要增強(qiáng) MySQL 查詢的人來說,遵循以下優(yōu)化技術(shù)將是一個(gè)好主意。
為 WHERE、ORDER BY 和 GROUP BY 子句中使用的列添加索引
這樣,您將提高 MySQL 查詢的性能,因?yàn)?MySQL 服務(wù)器將從數(shù)據(jù)庫中獲取結(jié)果的速度明顯更快。
在 SELECT 語句中指定必要的列
盡量避免使用 SELECT * FROM,因?yàn)樗鼨z索表的所有列,從而導(dǎo)致服務(wù)器上的額外負(fù)載并降低其性能。將始終指定 SELECT 語句中的列作為一項(xiàng)規(guī)則。
謹(jǐn)慎使用 DISTINCT 和 UNION
查詢調(diào)優(yōu)的另一個(gè)好技巧是僅在必要時(shí)使用 DISTINCT 和 UNION 運(yùn)算符,因?yàn)槭褂盟鼈兊牟樵儠?huì)導(dǎo)致服務(wù)器開銷并通常會(huì)增加響應(yīng)時(shí)間。考慮將 UNION 替換為 UNION ALL 并將 DISTINCT 替換為 GROUP BY 以提高流程效率。
避免在 LIKE 模式的開頭使用通配符
帶有 LIKE 運(yùn)算符的 MySQL 條件查詢通常會(huì)導(dǎo)致服務(wù)器性能下降,因此應(yīng)謹(jǐn)慎使用它們。當(dāng) LIKE 模式以通配符開頭時(shí),MySQL 不能使用索引,例如,'%xyz',并在這種情況下執(zhí)行全表掃描。在優(yōu)化 MySQL 查詢時(shí)應(yīng)牢記這一點(diǎn),并盡可能嘗試使用“xyz%”。
使用 INNER JOIN 而不是
OUTER JOIN 僅在必要時(shí)使用 OUTER JOIN。與 INNER JOIN 相比,MySQL 在獲取 OUTER JOIN 的結(jié)果方面做了更多的工作。我們建議您檢查您的 JOIN 查詢的性能,以防不滿意 - 盡可能開始將您的 OUTER JOIN 轉(zhuǎn)換為 INNER JOIN。 MySQL JOINs優(yōu)化可以帶來顯著的性能提升。
現(xiàn)在讓我們關(guān)注如何在性能調(diào)優(yōu)方面優(yōu)化 MySQL 服務(wù)器選項(xiàng)。為此,您需要調(diào)整配置文件 (my.cnf/my.ini)。
innodb_buffer_pool_size
該參數(shù)指定 MySQL 分配給 InnoDB 緩沖池的內(nèi)存量。此參數(shù)的推薦值為可用內(nèi)存的 70-80%。您的數(shù)據(jù)集越大,值應(yīng)該越大。
max_connection
該參數(shù)定義允許同時(shí)連接的最大客戶端連接數(shù),默認(rèn)值為151。為了避免出現(xiàn)“連接太多”錯(cuò)誤,可以增加該值。但是,請(qǐng)記住,打開的連接過多會(huì)影響性能。
query_cache_size
此參數(shù)設(shè)置分配給查詢緩存的內(nèi)存總量。它的最佳值主要取決于您的工作情況,需要暫時(shí)確定。這個(gè)想法是從非常小的開始——例如 10MB——然后以小增量增加到 100-200MB。調(diào)整query_cache_size,記得開啟查詢緩存(query-cache-type ON)。請(qǐng)注意,較大的查詢緩存大小會(huì)導(dǎo)致性能嚴(yán)重下降。
innodb_io_capacity
該參數(shù)指定后臺(tái)執(zhí)行的任務(wù)每秒允許的 I/O 操作數(shù),默認(rèn)值為 200。一般 100 左右的值適合普通硬盤,而更快更現(xiàn)代存儲(chǔ)設(shè)備較高的值將是有利的。
innodb_log_file_size
此參數(shù)指定日志組中每個(gè) MySQL 重做日志文件的大小(以字節(jié)為單位),默認(rèn)值為 134,217,728(約 128 MB)。innodb_log_files_in_group 參數(shù)依次指定日志組中的日志文件數(shù),默認(rèn)值為 2。如果 innodb_log_file_size 值對(duì)于您的工作負(fù)載來說很小并且您的應(yīng)用程序是寫密集型的,我們建議增加它。但是,太大的 innodb_log_file_size 會(huì)增加崩潰恢復(fù)時(shí)間。所以你必須找到它的最佳尺寸。
dbForge Studio for MySQL 帶有一個(gè)高級(jí)MySQL 分析器,它允許收集有關(guān)已執(zhí)行查詢的最完整的統(tǒng)計(jì)信息、發(fā)現(xiàn)慢速查詢以及對(duì)任何類型的性能問題進(jìn)行故障排除。
使用 dbForge MySQL 性能調(diào)優(yōu)工具,您可以:
使用 EXPLAIN 計(jì)劃優(yōu)化查詢
監(jiān)控會(huì)話統(tǒng)計(jì)
比較查詢分析結(jié)果
確定最昂貴的查詢
始終在測(cè)試環(huán)境中檢查優(yōu)化工作的結(jié)果
永遠(yuǎn)不要在沒有基準(zhǔn)測(cè)試的情況下進(jìn)行優(yōu)化
一次只改變一件事
將性能監(jiān)控添加到您的日常工作中
記錄結(jié)果
以上就是關(guān)于“Mysql高性能優(yōu)化和有效優(yōu)化技巧”的介紹,大家如果對(duì)此比較感興趣,想了解更多相關(guān)知識(shí),不妨來關(guān)注一下動(dòng)力節(jié)點(diǎn)的MySQL教程,里面的課程內(nèi)容細(xì)致全面,通俗易懂,很適合沒有基礎(chǔ)的小白學(xué)習(xí),希望對(duì)大家能夠有所幫助哦。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743