高性能MySQL讀書筆記 找出誰持有鎖
更新時間:2011年01月01日 22:56:32 作者:
周末重讀了一遍《高性能MySQL》,發(fā)現(xiàn)有些知識點(diǎn)看過便忘了,沒有實(shí)際動手操作一遍就是記不牢,所以今天動手操作了一下“找出誰持有鎖”,并把實(shí)驗(yàn)步驟記錄下來,有興趣的網(wǎng)友可以參照一二。
問題的背景:在實(shí)際使用MySQL時,如果訪問量比較大,那么很可能會出現(xiàn)大量Locked狀態(tài)的進(jìn)程,但是卻不能方便的識別是哪條SQL引起的問題,很多人遇到此類問題時,多半是通過PhpMyAdmin查詢可疑SQL,然后KILL掉,但問題是可疑SQL可能會很多,這樣逐一嘗試太過笨拙,有的人一怒之下很可能會重啟MySQL,但如此治標(biāo)不治本的方法肯定更不可取。
開始實(shí)驗(yàn),在test數(shù)據(jù)庫先建立一個測試表foo(注意:是MyISAM表類型),添加若干數(shù)據(jù):
CREATE TABLE IF NOT EXISTS `foo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`str` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
INSERT INTO `foo` (`id`, `str`) VALUES
(1, 'a'),
(2, 'b');
打開一個MySQL命令行終端:
mysql> USE test;
mysql> SELECT SLEEP(12345) FROM foo;
再打開一個MySQL命令行終端:
mysql> USE test;
mysql> UPDATE foo SET str='bar';
此時執(zhí)行SHOW PROCESSLIST,可以看到已經(jīng)出現(xiàn)Locked現(xiàn)象了:
10 User sleep SELECT sleep(12345) FROM foo
20 Locked UPDATE foo SET str = 'bar'
當(dāng)然,我們知道是SLEEP堵塞了UPDATE,但如果不是這個實(shí)驗(yàn),面對同樣的情況,比如說幾百個SQL查詢同時映入眼簾,我們?nèi)绾蝸砼袛嗄兀看藭r沒人能打包票,只能瞎蒙了,經(jīng)驗(yàn)有時候很重要,但我們還需要明確的命令,在這里就是:
mysqladmin debug
注意:如何你沒有設(shè)定“.my.cnf”配置文件的話,可能需要輸入用戶名和密碼參數(shù)
命令執(zhí)行后,不會有任何明確的輸出,不要著急,有價值的東西此時已經(jīng)被保存到了錯誤日志里:
mysql> SHOW VARIABLES LIKE 'log_error';
找到錯誤日志的具體路徑后,打開,查看日志的最后部分:
10 test.foo Locked - read Low priority read lock
20 test.foo Waiting - write High priority write lock
如此,我們就能看到id是10的SQL堵塞了id是20的SQL,至于具體的SQL,到SHOW PROCESSLIST里對照一下就能看到了。
開始實(shí)驗(yàn),在test數(shù)據(jù)庫先建立一個測試表foo(注意:是MyISAM表類型),添加若干數(shù)據(jù):
復(fù)制代碼 代碼如下:
CREATE TABLE IF NOT EXISTS `foo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`str` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
INSERT INTO `foo` (`id`, `str`) VALUES
(1, 'a'),
(2, 'b');
打開一個MySQL命令行終端:
mysql> USE test;
mysql> SELECT SLEEP(12345) FROM foo;
再打開一個MySQL命令行終端:
復(fù)制代碼 代碼如下:
mysql> USE test;
mysql> UPDATE foo SET str='bar';
此時執(zhí)行SHOW PROCESSLIST,可以看到已經(jīng)出現(xiàn)Locked現(xiàn)象了:
10 User sleep SELECT sleep(12345) FROM foo
20 Locked UPDATE foo SET str = 'bar'
當(dāng)然,我們知道是SLEEP堵塞了UPDATE,但如果不是這個實(shí)驗(yàn),面對同樣的情況,比如說幾百個SQL查詢同時映入眼簾,我們?nèi)绾蝸砼袛嗄兀看藭r沒人能打包票,只能瞎蒙了,經(jīng)驗(yàn)有時候很重要,但我們還需要明確的命令,在這里就是:
mysqladmin debug
注意:如何你沒有設(shè)定“.my.cnf”配置文件的話,可能需要輸入用戶名和密碼參數(shù)
命令執(zhí)行后,不會有任何明確的輸出,不要著急,有價值的東西此時已經(jīng)被保存到了錯誤日志里:
mysql> SHOW VARIABLES LIKE 'log_error';
找到錯誤日志的具體路徑后,打開,查看日志的最后部分:
10 test.foo Locked - read Low priority read lock
20 test.foo Waiting - write High priority write lock
如此,我們就能看到id是10的SQL堵塞了id是20的SQL,至于具體的SQL,到SHOW PROCESSLIST里對照一下就能看到了。
您可能感興趣的文章:
- MySQL索引背后的之使用策略及優(yōu)化(高性能索引策略)
- MySQL中實(shí)現(xiàn)高性能高并發(fā)計(jì)數(shù)器方案(例如文章點(diǎn)擊數(shù))
- MySQL 性能優(yōu)化的最佳20多條經(jīng)驗(yàn)分享
- MySQL配置文件my.cnf參數(shù)優(yōu)化和中文詳解
- MySQL Order by 語句用法與優(yōu)化詳解
- MySQL優(yōu)化必須調(diào)整的10項(xiàng)配置
- 淺談MySQL中優(yōu)化sql語句查詢常用的30種方法
- MySQL性能優(yōu)化之max_connections配置參數(shù)淺析
- MySQL 百萬級分頁優(yōu)化(Mysql千萬級快速分頁)
- Mysql高性能優(yōu)化技能總結(jié)
相關(guān)文章
myeclipse中連接mysql數(shù)據(jù)庫示例代碼
這篇文章主要為大家詳細(xì)介紹了MyEclipse連接MySQL數(shù)據(jù)庫圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10教你如何6秒鐘往MySQL插入100萬條數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了教你如何6秒鐘往MySQL插入100萬條數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08通過sysbench工具實(shí)現(xiàn)MySQL數(shù)據(jù)庫的性能測試的方法
sysbench是一款壓力測試工具,可以測試系統(tǒng)的硬件性能,也可以用來對數(shù)據(jù)庫進(jìn)行基準(zhǔn)測試。這篇文章主要介紹了通過sysbench工具實(shí)現(xiàn)MySQL數(shù)據(jù)庫的性能測試 ,需要的朋友可以參考下2019-07-07分析Mysql事務(wù)和數(shù)據(jù)的一致性處理問題
本篇文章主要給大家介紹了Mysql事務(wù)和數(shù)據(jù)的一致性處理問題,跟著小編一起學(xué)習(xí)下吧。2017-12-12mysql 一次向表中插入多條數(shù)據(jù)實(shí)例講解
這篇文章主要介紹了mysql 一次向表中插入多條數(shù)據(jù)實(shí)例講解的相關(guān)資料,需要的朋友可以參考下2016-10-10