1. 程式人生 > >總結-Mysql資料庫鎖表的原因和解決方法

總結-Mysql資料庫鎖表的原因和解決方法

鎖表的原因:
當多個連線(資料庫連線)同時對一個表的資料進行更新操作,那麼速度將會越來越慢,持續一段時間後將出現資料表被鎖的現象,從而影響到其它的查詢及更新。  
例如:
儲存過程迴圈30次更新操作(cycore_file_id 為唯一標識)


/*30次更新操作*/ BEGIN   DECLARE v1 INT DEFAULT 30;   WHILE v1 > 0 DO
    update jx_attach set complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f';
    SET v1 = v1 - 1
; END WHILE; END

執行結果(速度非常慢)

時間: 29.876s

Procedure executed successfully
受影響的行: 0

200個數據更新操作,三個資料庫連線同時執行

update jx_attach set complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f';
 update jx_attach set complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f'
;
update jx_attach set complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f'; update jx_attach set complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f'; update jx_attach set complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f'; update jx_attach set
complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f';
...等等

執行結果(持續一段時間後速度越來越慢,出現等待鎖) 

# Time: 151208 22:41:24
# [email protected]: zmduan[zmduan] @ [192.168.235.1] Id: 2
# Query_time: 1.848644 Lock_time: 0.780778 Rows_sent: 0 Rows_examined: 393382
SET timestamp=1449643284;
update jx_attach set complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f';

.........
........

# [email protected]: zmduan[zmduan] @  [192.168.235.1]  Id:     2
# Query_time: 2.868598  Lock_time: 1.558542 Rows_sent: 0  Rows_examined: 393382
SET timestamp=1449643805;
update jx_attach set complete=1,attach_size=63100 where cycore_file_id='56677142da502cd8907eb58f';
[[email protected]ocalhost log]# tail -f slow_query.log 
# [email protected]: zmduan[zmduan] @  [192.168.235.1]  Id:    19
# Query_time: 1.356797  Lock_time: 0.000169 Rows_sent: 1  Rows_examined: 393383
SET timestamp=1449643805;

上述例子的原因分析:
MySQL的innodb儲存引擎支援行級鎖,innodb的行鎖是通過給索引項加鎖實現的,這就意味著只有通過索引條件檢索資料時,innodb才使用行鎖,否則使用表鎖。根據當前的資料更新語句(update jx_attach set complete=1,attach_size=63100 where cycore_file_id=’56677142da502cd8907eb58f’;),該條件欄位cycore_file_id並沒有新增索引,所以導致資料表被鎖。
解決辦法
為cycore_file_id新增索引
最終效果(30次更新操作)
時間: 0.094s
Procedure executed successfully
受影響的行: 0

另外又蒐集一些在併發執行時會鎖表的sql語句,如下:
這裡寫圖片描述

解釋以及說明(前提是併發執行):
假設kid是表table 的 一個索引欄位 且值不唯一
1.如果kid 有多個值為12的記錄那麼:
update table set name=’feie’ where kid=12;
會鎖表
2.如果kid有唯一的值為1的記錄那麼:
update table set name=’feie’ where kid=1;
不會鎖

總結:用索引欄位做為條件進行修改時, 是否表鎖的取決於這個索引欄位能否確定記錄唯一,當索引值對應記錄不唯一,會進行鎖表,相反則行鎖。

如果有兩個delete 而 kid1 與 kid2是索引欄位
語句1 delete from table where kid1=1 and kid2=2;
語句2 delete from table where kid1=1 and kid2=3;
這樣的兩個delete 是不會鎖表的
語句1 delete from table where kid1=1 and kid2=2;
語句2 delete from table where kid1=1 ;
這樣的兩個delete 會鎖表
總結:同一個表,如果進行刪除操作時,儘量讓刪除條件統一,否則會相互影響造成鎖表

相關推薦

總結-Mysql資料庫原因解決方法

鎖表的原因: 當多個連線(資料庫連線)同時對一個表的資料進行更新操作,那麼速度將會越來越慢,持續一段時間後將出現資料表被鎖的現象,從而影響到其它的查詢及更新。   例如: 儲存過程迴圈30次更新操作(cycore_file_id 為唯一標識) /*30

資料庫原因解決思路

1、鎖表發生在insert update 、delete 中 2、鎖表的原理是 資料庫使用獨佔式封鎖機制,當執行上面的語句時,對錶進行鎖住,直到發生commite 或者 回滾 或者退出資料庫使用者 3、鎖表的原因 第一、 A程式執行了對 tableA 的 in

mysql 直接從date 資料夾備份,還原資料庫之後提示 table doesn`t exist的原因解決方法

如型別是MyISAM, 資料檔案則以”Table.frm””Table.MYD””Table.MYI””三個檔案儲存於”/data/$databasename/”目錄中.如型別是InnoDB, 資料檔案則儲存在”$innodb_data_home_dir/″中的ibdat

原因解決思路

data- 操作數 -m mit sdn 事物 i/o 之間 art 1、鎖表發生在insert update 、delete 中 2、鎖表的原理是 數據庫使用獨占式封鎖機制,當執行上面的語句時,對表進行鎖住,直到發生commite 或者 回滾 或者退出數據庫用戶

MySQL的Illegal mix of collationsy異常原因解決方法

ear 代碼 clear 今天 tag 類型 資料 bsp net 原創 2008年12月25日 11:54:00 標簽: mysql / collation / character / variables / database / server 今天

MySQL CPU 使用率高的原因解決方法(來自aliyun官方文件)

  使用者在使用 MySQL 例項時,會遇到 CPU 使用率過高甚至達到 100% 的情況。本文將介紹造成該狀況的常見原因以及解決方法,並通過 CPU 使用率為 100% 的典型場景,來分析引起該狀況的原因及其相應的解決方案。 常見原因 系統執行應用提交查詢(包括資料修改操

"ORA-00942: 或檢視不存在 "的原因解決方法(非常好)

執行上面的sql時提示"ORA-00942 表或檢視不存在",納悶了,用select * from AUTH.AUTH_ORG_FRAM語句查詢時可以查到資料,但建立檢視時就提示找不到, 原來是,我

Servlet執行原理及404、500、405異常原因解決方法總結

一、Servlet執行原理 比如,在瀏覽器位址列輸入          http://ip:port/web01/hello 整個通訊流程如下圖所示: 分步解釋:          1、瀏覽器依

mysql安裝不上怎麼辦 mysql安裝失敗原因解決方法

困難1:MySQL 5.1 安裝過程中報apply security setting錯誤 1.解除安裝MySQL。 2.刪除目錄 C:\Documents and Settings\All Users\Application Data\MySQL。 3.重新安裝MySQL就OK啦。 困難2:MySQL提示C

SQL Server資料庫查詢速度慢的原因解決方法

SQL Server資料庫查詢速度慢的原因有很多,常見的有以下幾種:   1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程式設計的缺陷)   2、I/O吞吐量小,形成了瓶頸效應。   3、沒有建立計算列導致查詢不優化。   4、記憶體不足   5、網路速度慢   

資料庫的檢查解決方法

資料庫死鎖的檢查方法一、         資料庫死鎖的現象程式在執行的過程中,點選確定或儲存按鈕,程式沒有響應,也沒有出現報錯。二、         死鎖的原理當對於資料庫某個表的某一列做更新或刪除等操作,執行完畢後該條語句不提交,另一條對於這一列資料做更新操作的語句在執行的

mysql原因解決辦法

本文轉載自http://www.jb51.net/article/78088.htm 死鎖(Deadlock) 所謂死鎖:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或

ORA-00942: 或檢視不存在 "的原因解決方法

採用Oracle資料庫,使用Powerdesigner設計,生成Sql檔案匯入後查詢出現“ORA-00942: 表或檢視不存在 ”,很是鬱悶,這個問題以前出現過,當初解決了,但因好久沒有使用,這次竟然忘了,害得我浪費了好些時間,為了避免再次忘記,將它記下來,同時和大家一起

"ORA-00942: 或檢視不存在 "的原因解決方法

採用Oracle資料庫,使用Powerdesigner設計,生成Sql檔案匯入後查詢出現“ORA-00942: 表或檢視不存在 ”,很是鬱悶,這個問題以前出現過,當初解決了,但因好久沒有使用,這次竟然忘了,害得我浪費了好些時間,為了避免再次忘記,將它記下來,同時和大家一起分享

mysql主從同步延遲原因解決方法

解決方案 數據庫 master 朋友 mysql MySQL主從延遲原因以及解決方案:談到MySQL數據庫主從同步延遲原理,得從mysql的數據庫主從復制原理說起,mysql的主從復制都是單線程的操作(mysql5.6版本之前),主庫對所有DDL和DML產生binlog,binlog是順序

angularJS報錯$apply already in progress的原因解決方法

$apply eap module 關註 當前 typeof else ply 沒有 如果我們使用了AngularJS中的$scope.$apply()或者$scope.$digest(),我們很可能會遇到類似下面的錯誤,雖然這個錯誤沒有太大影響,但是在日誌中看起來還是很不

[python]命令窗口顯示不是內部或外部命令的原因解決方法

命令 所在 dos 今天 屬性 add 系統 進入 文件 今天做習題時總是提示錯誤“不是內部或外部命令,也不是可運行的程序……” 於是上網搜索了一下出現這個錯誤的原因和解決方法,在此做個總結。 原因一:沒有設置PATH環境變量   Windows會根據設置的Path環境

關於網站開發中div標簽中設置寬度後其中文本溢出的原因解決方法

lan 解析 info tro 情況 href targe 圖片 com 一.問題產生的原因   當我們為div標簽聲明了寬度,但是仍然會出現文本越界的情況,不知道大家有沒有發現,只有文本內容為單詞或者純數字 的時候才會出現這種情況為此我特意測試了兩種情況,結果如下:

WPF 程序無法觸摸操作?我們一起來找原因解決方法

line 坐標 團隊 github webkit pro rgba alter 徹底 原文:WPF 程序無法觸摸操作?我們一起來找原因和解決方法! 版權聲明:本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡