爲什麼連接到我的InnoDB數據庫通常會延遲整數秒的時間?連接到MySQL數據庫很慢,需要n秒
一些背景
我有一個非常小的MySQL數據庫,由表 '用戶'(150條記錄)和表 '連接'(增長到150 * 150條記錄)。表和索引加起來小於5 MB。
當用戶處於活動狀態時,「連接」中的5-50條記錄發生更改(重量發生變化)或添加(如果它們尚不存在)。整個應用程序運行平穩,加載時間低於〜100毫秒。
除外。
細節
下甚至相當小的負載,頁面加載時間秒殺從60毫秒到毫秒和10000毫秒之間的某處1000。
使用Symfony中的分析器,我可以在'getRepository'語句中鎖定95 +%的延遲,而查詢每個查詢只需要約1毫秒。這使我相信連接數據庫是一個緩慢的行動。我寫了一個定期連接到數據庫的幫手腳本來測試這個理論。
<?php // call this script commandline using watch
$a = microtime(true);
$pdo = new PDO('mysql:host=127.0.0.1;dbname=mydb','myuser','mypass');
file_put_contents('performance.txt', (microtime(true)-$a).PHP_EOL, FILE_APPEND);
神祕
連接到數據庫了一貫1-3毫秒,或1,001-1,003毫秒,或2,001-2,003毫秒,或3,001-3,003毫秒等的一個整數量秒,加上正常的時間。之間沒有什麼,如400毫秒或800毫秒。在沒有寫入的情況下,連接幾乎立即進行。一旦通過應用程序進行了一些寫操作,就會達到更高的數字。
是什麼導致了這種行爲? InnoDB page_cleaner似乎每隔1000毫秒就會完成一次工作,也許這是解釋的一部分?
更重要的是,我該如何解決這個問題?我正在考慮切換到MEMORY表,但我會說更優雅的選項應該可用。
編輯
根據要求,the variables and global status。
附加信息:我直接連接到127.0.0.1(請參閱上面的代碼片段),我測試了skip-name-resolve標誌,結果無效。順便說一下,這是一個Debian服務器。
編輯2
我發現的延遲要麼1,3,7或15秒。注意模式:1秒,+ 2s,+ 4s,+ 8s。這真的看起來有些超時問題...
讀取更改爲內存表,如果問題是連接,如果我理解你正確地發出可能不會幫助。我會懷疑的事情:沒有足夠的線程/(db)連接可用,連接池設置(僅僅因爲我們曾經遇到過一個問題:))或類似的東西。連接速度很慢,而不是查詢。也許看看'innotop'屏幕,而緩慢進行?如果你沒有看到任何長時間運行的查詢和更高的負載,則創建連接時出現問題 – Nanne
不知道'innotop',感謝提示。負載:0.00,QPS:10-20,慢速:0,QCacheHit:50%,KCacheHit:100.00%。看起來問題確實不是問題。 – TacoV
我切換到MEMORY作爲測試。奇怪的連接延遲問題依然存在...... – TacoV