因爲需要啓動時load數據到內存,重啓數據庫很慢

我在做貼吧系統的時候,每次訪問頁面都要請求一次權限。所以,這個請求權限的請求, 訪問概率會非常高,不可能每次都去數據庫裏查,怎麼辦呢?
我想了個簡單的方案:在應用程序裏面開了個很大的內存,啓動的時候就把整張表全部 load 到內存裏去。這樣再有權限請求的時候,直接從內存裏取就行了。 數據庫重啓時,我的進程也會跟着重啓,接下來就會到數據表裏面做全表掃描,把整個用戶相關信息全部塞到內存裏面去。 但是,後來我遇到了一個很鬱悶的情況。有時候 MySQL 崩潰了,我的程序重新加載權限 到內存裏,結果這個 select 語句要執行 30 分鐘左右。本來 MySQL 正常重啓一下是很快的,進程重啓也很快,正常加載權限的過程只需要兩分鐘就跑完了。但是,爲什麼異常重啓的時候就要 30 分鐘呢
 
 
我沒轍了,只好去看源碼。然後,我發現 MySQL 有個機制,當它覺得系統空閒時會盡量 去刷髒頁。 具體到我們的例子裏MySQL 重啓以後,會執行我的進程做全表掃描,但是因爲這個時 候權限數據還沒有初始化完成,我的 Server 層不可能提供服務,於是MySQL 裏面就只有我那一個 select 全表掃描的請求,MySQL 就認爲現在很閒,開始拼命地刷髒頁,結果就喫掉了大量的磁盤資源,導致我的全表掃描也跑得很慢。 知道了這個機制以後,我就寫了個腳本,每隔 0.5 秒發一個請求,執行一個簡單的 SQL 查
詢,告訴數據庫其實我現在很忙,髒頁刷得慢一點。腳本一發布使用,髒頁果然刷得慢了,加載權限的掃描也跑得很快了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章