我們在使用MySQL的時候,由于各種原因會出現超時的情況,我認為常見的有連接超時、等待超時、鎖等待超時等等。可以使用show variables 來看看默認的各種類型超時時間。mysql中超時時間單位為秒。
show variables like '%timeout%'

默認超時時間
連接超時
- connect_timeout:這個我認為可以講是最常見的超時情況了,它是設置連接的超時時間,默認10秒。它主要指的是mysql客戶端與服務器之間的tcp連接結果,并且是多次連接的結果,每次連接除了基本的用戶名和密碼之外,還需要進行主機權限驗證、域名解析。如果此過程中有任何網絡故障,通過設置連接超時,可以防止他們之間反復進行連接重試,網絡故障不是一時半會能解決,超時設置可以使得程序正常中斷,便于我們后續操作。
- wait_timeout:默認值為28800秒。這個超時主要防止一些非網絡問題導致客戶端長期占用連接情況,例如某些原因導致鎖表,而我們應用卻一直要請求更新表,這樣如果超過了等待時間,mysql會主動斷開連接。
- interactive_timeout:默認值為28800秒。主要防止某些mysql服務器對象保持了睡眠狀態超過了交互式等待時間,mysql會主動斷開連接。交互式連接主要指的是客戶端在命令行窗口,什么都不操作,而服務器在等待輸入命令時候也要保持的連接。
- net_write_timeout:默認值60秒。主要是客戶端進行一個大數據查詢,mysql服務器返回結果集數據量很大,網絡傳輸數據會耗時,如果耗時超過60秒,mysql主動斷開,避免連接浪費。
- net_read_timeout:默認值60秒,與上述返回相反,客戶端讀取了這個大的數據源,如果超時,則mysql主動斷開。
鎖等待超時
- Innodb_lock_wait_timeout:默認值50秒,行鎖等待超時時間,當出現行級鎖鎖等待現象時候,鎖等待時間超過50秒,會導致行級鎖等待的sql語句回滾,如果希望整個事務回滾,需要開啟innodb_rollback_on_timeout參數。
- innodb_rollback_on_timeout:默認值為OFF,設置為on,則因行級鎖超時則會直接回滾整個事務操作。
由此可見,innodb存儲引擎一旦出現鎖超時異常,默認不會回滾事務,這對應用來說,非常不合理,所以鎖等待超時異常發生后,你的應用程序應該自定義處理,要嘛提交事務,要嘛回滾事務。
復制連接超時
slave_net_timeout:mysql進行主從復制時候,當從服務器從主服務器讀取二進制日志失敗后,它會繼續等待slave_net_timeout設置的時間后,重連服務器并獲取數據,默認值60秒。
MyISAM表延遲插入超時
delayed_insert_tiemout:為MyISAM存儲引擎設置的,主要為insert語句超時時間,在鎖表情況下,insert語句會一直處于等待中,當超過默認值300秒,則中斷連接。
總結
本節重點講解了各種超時情況,只有了解它們,我們才有可能針對性的優化,并且在超時異常出現之后,能快速定位及處理。當然應用環境不同,超時異常產生原因復雜,這都需要我們在生產中積累經驗。