mysql進階(三)

 

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 就可以對查詢語句加鎖