SQL慢查詢日誌:
mysql提供的一種日誌系統,用於記錄響應時間超過閥值的sql語句(long_query_time 默認10秒)
慢查詢日誌是默認關閉的,開發調試時可以打開,上線時要關閉
檢查是否開啓了慢查詢日誌:show variables like "%show_query_log%"
日誌的查看
profiles會記錄所有sql語句花費的時間
精確查看時間消耗
行鎖和表鎖
表鎖:顧名思義就是對整張表進行加鎖,同一時刻整張表所有記錄都被霸佔,雖然不會出現死鎖問題但是鎖衝突高堵塞高,併發低。
行鎖:很明顯只對某一行進行加鎖,這樣表的其餘行並不會被佔用,衝突低,併發高,但是死鎖很可能出現。
鎖衝突:就是在多個線程在對競爭資源想同時加鎖,僵持不下。
死鎖:就是你請求的被別人鎖住,被人請求被你鎖住了,對方都沒法進行下去。
首先行鎖是innodb默認的鎖,但是在篩選條件裏面沒有索引字段時就會把整個表鎖住其他,下面會給出測試例子,最後會講下mysql innodb引擎爲啥需要使用索引來完成對行加鎖。
總結:會話0對A表加了讀鎖;其他會話:可以對其他表(除A表以外的表)進行讀 寫 操作
其他會話:對A表,讀:可以, 寫:需要等待釋放鎖(即會話0執行 unlock tables;)
分析表鎖定:
查看那些表加了鎖:show open tables; 1代表加了鎖
查看錶鎖定的嚴重程度: show status like 'tables%'
table_locks_immediate:可能獲取到的鎖數
table_locks_waited:需要等待的表鎖數,如果值越大,則表示存在越大的鎖競爭
一般建議 如果 table_locks_immediate/table_locks_waited >5000 建議用innodb 否則建議用myisam
行鎖注意事項:若果沒有索引則行鎖轉爲表所
行鎖的特殊情況:間隙鎖
如果只是查詢能否加鎖
可以 在查詢語句中加上 for update 就可以對查詢語句加鎖