Navicat使用教程:MySQL 8性能架構(gòu)如何幫助診斷查詢死鎖
Navicat Premium 是一套數(shù)據(jù)庫管理工具,讓你使用一個程序即可同時連接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 數(shù)據(jù)庫。
MySQL 5.5增加了performance_schema和information_schema數(shù)據(jù)庫。正如前面文章內(nèi)容,information_schema中的表包含有關(guān)表、插件、分區(qū)、進(jìn)程列表、狀態(tài)和全局變量的統(tǒng)計信息。顧名思義,Performance_schema的表可用于改善MySQL實(shí)例的性能。如何做到這一點(diǎn)將成為今天文章的主題。就像上次一樣,我們將使用Navicat Premium演示各種查詢。
簡要概述
性能模式是一種用于在低級別監(jiān)視MySQL服務(wù)器執(zhí)行的工具。性能架構(gòu)的存儲引擎共享了“performance_schema”名稱,以便于與其他存儲引擎區(qū)分開。擁有自己的引擎使我們能夠訪問有關(guān)服務(wù)器執(zhí)行的信息,同時對服務(wù)器性能的影響最小。此外,它使用視圖或臨時表,以最大程度地減少持久性磁盤存儲。最后,內(nèi)存分配全部在服務(wù)器啟動時完成,因此沒有進(jìn)一步的內(nèi)存重新分配或大小調(diào)整,這極大地簡化了性能。
從MySQL 5.6.6起默認(rèn)啟用性能模式。在該版本之前,默認(rèn)情況下處于禁用狀態(tài)。您可以使用以下語句驗(yàn)證其狀態(tài):
如果需要,可以始終通過使用——performance-schema = ON標(biāo)志啟動服務(wù)器來顯式啟用它。
現(xiàn)在,我們來看看Performance_schema的一些實(shí)際應(yīng)用。
互斥鎖和線程速成班
互斥鎖是代碼中使用的一種同步機(jī)制,用于強(qiáng)制在給定時間只有一個線程可以訪問某些公共資源。據(jù)說該資源已由互斥鎖“保護(hù)”?!癕utex”一詞是“互斥變量”的非正式縮寫,它本身是“互斥”的縮寫。在MySQL中,它是InnoDB用于表示和強(qiáng)制對內(nèi)部內(nèi)存數(shù)據(jù)結(jié)構(gòu)進(jìn)行互斥鎖的低級對象。運(yùn)作方式如下:
一旦獲取了鎖,就可以防止任何其他進(jìn)程,線程等獲取相同的鎖。在InnoDB中,執(zhí)行的多個線程訪問共享的數(shù)據(jù)結(jié)構(gòu)。InnoDB將這些訪問與自己的互斥鎖和讀/寫鎖實(shí)現(xiàn)同步。當(dāng)服務(wù)器中執(zhí)行的兩個線程(例如,同時執(zhí)行查詢的兩個用戶會話)需要訪問相同的資源(例如文件、緩沖區(qū)或某些數(shù)據(jù))時,這兩個線程將相互競爭,因此獲得互斥鎖的第一個查詢將導(dǎo)致另一個查詢等待,直到第一個查詢完成并解鎖互斥鎖。如果第一個線程需要很長時間才能完成,則它可能會阻止其他進(jìn)程。
一些有用的查詢
所有互斥鎖都在“性能模式”的Mutex_instances表中列出,這對于調(diào)查性能瓶頸非常有幫助。Mutex_instances.LOCKED_BY_THREAD_ID和rwlock_instances.WRITE_LOCKED_BY_THREAD_ID列對于調(diào)查性能瓶頸或死鎖非常重要。使用方法如下:
假設(shè)線程1處于等待互斥的狀態(tài)。
您可以確定線程正在等待什么:
如果查詢結(jié)果標(biāo)識線程正在等待互斥鎖A,可在events_waits_current.OBJECT_INSTANCE_BEGIN中找到。
您可以確定哪個線程持有互斥鎖A:
假設(shè)查詢結(jié)果表明它是持有互斥鎖A的線程2,如在Mutex_instances.LOCKED_BY_THREAD_ID中找到的那樣。
您可以使用此查詢查看線程2在做什么:
結(jié)論
在今天的文章中,我們學(xué)習(xí)了如何使用性能模式來診斷MySQL 8中的瓶頸和/或死鎖。一種更簡單的方法是使用Navicat Monitor。它具有一個查詢分析器,該分析器顯示所有正在執(zhí)行的查詢的摘要信息,并讓您輕松檢測死鎖,例如當(dāng)兩個或多個查詢永久相互阻塞時。
相關(guān)內(nèi)容推薦:
想要購買該產(chǎn)品正版授權(quán),或了解更多產(chǎn)品信息請點(diǎn)擊“咨詢在線客服”