溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL如何優(yōu)化性能

發(fā)布時(shí)間:2022-09-22 14:04:17 來源:億速云 閱讀:118 作者:iii 欄目:MySQL數(shù)據(jù)庫(kù)

本文小編為大家詳細(xì)介紹“MySQL如何優(yōu)化性能”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“MySQL如何優(yōu)化性能”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

- MySQL服務(wù)器配置:\

好吧,首先你應(yīng)該知道配置文件的位置,具體取決于你的操作系統(tǒng)。在 Linux 系統(tǒng)中,它位于“/etc/mysql/my.cnf”中。\
現(xiàn)在是時(shí)候選擇你的引擎 InnoDB 和 MyISAM 了。為了讓選擇更容易,你應(yīng)該知道 InnoDB 成為 MySQL 5.5 的默認(rèn)引擎,因?yàn)樗С帧靶屑?jí)鎖定、外鍵和事務(wù)”,而 MyISAM 不支持任何提到的特性,這使得它在現(xiàn)代很少有用應(yīng)用程序。\
選擇正確的引擎后,是時(shí)候在 my.cnf 文件中設(shè)置一些配置變量了。

max_connection 變量:\

max_connection 變量表示應(yīng)用程序允許的連接數(shù)。默認(rèn)值為 151 連接,但是,如果你收到錯(cuò)誤消息“MySQL 錯(cuò)誤,連接太多...”,你可以輕松增加此數(shù)量\

最大連接數(shù) = 170

innodb_buffer_pool_size 變量:\

為了加快速度,MySQL 會(huì)將數(shù)據(jù)緩存在你的服務(wù)器內(nèi)存中,這個(gè)變量告訴 MySQL 它可以使用多少 GigaBytes。如果你在數(shù)據(jù)庫(kù)中保存大 blob,此變量非常有用。你可以將其設(shè)置為服務(wù)器內(nèi)存的 80–90%。因此,如果你的服務(wù)器內(nèi)存為 16GB,則可以將其設(shè)置為 14GB。

innodb_buffer_pool_size = 14GB

innodb_io_capacity 變量:\

這個(gè)變量告訴 MySQL 它可以使用多少輸入/輸出操作,它取決于你的磁盤。例如,單個(gè) 7200 RPM 驅(qū)動(dòng)器限制為 200 I/O,而企業(yè) SSD 磁盤限制為 50,000 I/O。你可以在操作系統(tǒng)上通過命令行輕松找到輸入/輸出值,并將變量設(shè)置為可用 I/O 的 90%,因此 MySQL 永遠(yuǎn)不會(huì)使用太多 I/O 操作。

innodb_io_capacity = 21000

query_cache_limit 和 query_cache_size 變量:\

MySQL 也支持內(nèi)存中緩存數(shù)據(jù),但是我們不能依賴它來做緩存系統(tǒng),因?yàn)槊看文愕某绦蛳驍?shù)據(jù)庫(kù)表寫入數(shù)據(jù)的時(shí)候,MySQL 將會(huì)重建整個(gè)表的查詢緩存。因此如果你的程序有很高的負(fù)載,MySQL 緩存將完全無用,這種情況下,兩個(gè)變量最好設(shè)置為0,節(jié)省MySQL緩存的開銷,相反,你可以使用類似 Redis 的東西來管理緩存。

query_cache_limit = 0

query_cache_size = 0

慢查詢?nèi)罩?\

慢查詢?nèi)罩緦?huì)顯示你的哪些查詢超過你定義的閾值,而不需要猜測(cè)哪個(gè)查詢更慢。\
首先,你必須在你的配置文件中啟用 slow_query_log 。在Linux服務(wù)器中,打開 「/etc/mysql/my.cnf」或者你系統(tǒng)上同等的文件。\
并添加:

slow_query_log = 1

long_query_time = 1

那么,這兩個(gè)選項(xiàng)將啟用慢查詢?nèi)罩?,并記錄任何需要超過一秒的查詢。如果你喜歡在一個(gè)表中而不是在一個(gè)文件中查看日志,你可以添加:

log_output = 'TABLE'

然后你可以在「slow_log」表中找到你的日志。你可以在那里看到所有執(zhí)行超過一秒的慢查詢的信息。這些信息包括查詢的確切執(zhí)行時(shí)間和受影響的行數(shù),以及哪個(gè)用戶執(zhí)行的它。

查詢優(yōu)化\

在你得到所有的慢查詢后,你需要一種方式來優(yōu)化它們,使它們更快。因此,你可以在查詢語(yǔ)句前面加上「explain」關(guān)鍵詞,從而獲得相關(guān)查詢的詳情信息,例如:explain select * from users where active=1;

「解釋」關(guān)鍵字可以幫助你定義查詢命中哪些索引以及為獲取數(shù)據(jù)而查詢的行數(shù)。此信息可以告訴你是否需要?jiǎng)?chuàng)建更多索引或重組數(shù)據(jù)庫(kù)表。

非規(guī)范化和約束:\

非規(guī)范化是通過添加冗余數(shù)據(jù)或?qū)⑺鼈兎纸M來提高讀取性能的過程。例如,如果你有一個(gè)「產(chǎn)品」表和一個(gè)「類別」表,并且每次查詢「產(chǎn)品」表時(shí),你還需要獲取每個(gè)產(chǎn)品的「類別名稱」。在這種情況下,你可以使用「join」來檢索「category_name」。但是,這意味著每次用戶打開產(chǎn)品頁(yè)面時(shí),都會(huì)執(zhí)行一個(gè)復(fù)雜的連接查詢。因此,你可以考慮在「產(chǎn)品」表中添加「類別名稱」。盡管有冗余數(shù)據(jù),但讀取性能的提高還是值得的。

非規(guī)范化方法可能會(huì)導(dǎo)致「產(chǎn)品」表中的「類別名稱」過時(shí)。所以你需要定義一個(gè)「外鍵」約束,但是你需要知道一個(gè)「外鍵」會(huì)使寫入性能稍微變慢,因?yàn)?MySQL 需要在寫入數(shù)據(jù)之前檢查約束。所以做出最佳選擇始終是你的任務(wù)。

讀到這里,這篇“MySQL如何優(yōu)化性能”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI