Mysql鎖表問題及sql優化

2021-09-28 14:45:51 字數 1308 閱讀 7420

1、在做資料庫操作時,有時會因為自己的粗心或者程式設計上的缺陷導致鎖表,在mysql中檢視鎖表和解鎖的步驟如下:

//1.檢視當前資料庫鎖表的情況

select * from information_schema.innodb_trx;

//2.殺掉查詢結果中鎖表的trx_mysql_thread_id

kill trx_mysql_thread_id

2、另外一種查詢鎖方法
1、查詢是否鎖表

show open tables where in_use > 0;

2、查詢程序

show processlist

查詢到相對應的程序===然後 kill id

補充:檢視正在鎖的事務

select * from information_schema.innodb_locks;

檢視等待鎖的事務

select * from information_schema.innodb_lock_waits;

遇到的問題:

這個查詢語句導致了鎖表問題,對它進行優化

select ba.*,ac.iseffective

from tb_yx_base_activation ba,tb_yx_activation_code ac

where ba.id = ac.baseactivationid and ba.`status` = 2 and ac.iseffective < 3;

發生鎖表的原因:

多表聯合查詢時,使用where和and組合進行查詢會導致笛卡爾積掃瞄

解決方式:

使用join連線,並且不要使用ba.*

優化後的sql語句:

select ba.id,ba.`type`,ba.newuseronly,ba.name,ba.channel,ba.codecount,ba.codeprefix,ba.activecount,ba.`status`,ba.validstarttime,ba.validendtime,ba.creatuser,

ba.updateuser,ba.createtime,ba.updatetime,ba.isedit,ac.iseffective

from tb_yx_base_activation ba

left join tb_yx_activation_code ac on ba.id = ac.baseactivationid

where ba.`status` = 2 and ac.iseffective < 3;

MySQL優化 SQL及索引優化(二)

對支付時間建立索引 create index idx paydate on payment payment date 查詢 select max payment date from payment 在一條sql中同時查出2006年和2007年電影的數量 優化count 函式 對count函式使用的列...

MySQL解決鎖表問題

1.為何會鎖表 首先我們了解一下資料庫查詢機制,首先我們用工具進行連線查詢時,會建立乙個connection,此時資料庫會將查詢語句解析成一棵 樹 各個引擎底層的結構不一樣,mysql的話在innodb用的是b tree,俗稱b 樹,那麼再到執行器進行處理,最後返回給客戶端。鎖表的原因 當多個連線 ...

MySQL鎖表問題處理

mysql中鎖表導致的報錯可以找到正在執行的導致鎖表的程序,kill 掉程序即可解決。select from information schema.innodb trx 一般情況下長期處於running狀態的程序基本就是導致鎖表的程序。例如該事務程序涉及多個sql語句執行,執行到一半時遇到其他事務正...