一、資料表結構
二、現象
當多個連接配接同時對一個表的資料進行更新操作,那麼速度将會越來越慢,持續一段時間後将出現資料表被鎖,進而影響到其它的查詢及更新。
存儲過程循環30次更新操作
執行結果(速度非常慢)
時間: 29.876s
Procedure executed successfully受影響的行: 0
200個資料更新操作,三個資料庫連接配接同時執行
執行結果(持續一段時間後速度越來越慢,出現等待鎖)
# 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: 393382SET 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] 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;
SELECT *
FROM jx_attach ja,jx_feed jf
where ja.feed_id=jf.feed_id and ja.cycore_file_id='56677146da502cd8907eb5b7';
# [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';
三、原因分析
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