2010-06-09 85 views
1

我有一張超過150,000行的表,其中大多數行將每天更新。我打開了mysql緩存,所以頁面加載速度更快,但是每次數據庫更新時頁面都會再次加載緩慢,我認爲這是緩存重新構建自己。如何手動構建mysql緩存

所以目前我已經在服務器上做了一個wget -m --delete-after http://localhost/然而這需要大約4個小時才能完成並移動像13個演出。

有沒有更好的方法來做到這一點?

回答

4

根據您使用MyISAM存儲引擎還是InnoDB存儲引擎,MySQL緩存的工作方式有所不同。

MyISAM僅緩存索引,而不是數據。您可以使用LOAD INDEX INTO CACHE將MyISAM索引預加載到密鑰緩衝區緩存中。但是,如果您使用InnoDB,則沒有相應的聲明。

InnoDB緩存數據和索引頁面。沒有專門的命令來預熱緩存緩衝區,但是您可以執行一些執行完整表掃描和完整索引掃描的SQL語句來將它們加載到緩衝區中。您應該可以使用服務器上的腳本來完成此操作,而無需使用wget

我同意@code_burgar的回答:150k行足夠小,以至於在緩存正在升溫時,您應該注意不到太多的性能損失。

如果你正在討論熱身Query Cache,這是一個不同的問題。您必須使用特定的SQL查詢來預熱查詢緩存,因爲該緩存會逐字地將結果集與這些SQL查詢保持關聯。您的wget解決方案效率低下,可能會重複大量工作。您應該能夠通過在執行每個要緩存的查詢的服務器上運行腳本一次來啓動查詢緩存。

但是,您可能需要執行代碼審查來確定這些查詢是什麼,並在代碼更改時定期更新緩存預加載腳本。

+0

非常感謝MyISAM,所以我會在早上嘗試LOAD INDEX INTO CACHE命令,看看它是否有用。對於查詢緩存來說,就像從每個表中選擇所有內容一樣簡單? – hamstar 2010-06-09 22:20:09

+1

查詢緩存爲特定查詢緩存結果集。因此,從每個表格中選擇所有內容都無濟於事(除非這些是您在應用程序中使用的查詢,我懷疑)。 – 2010-06-09 22:25:32

+0

這樣做,它現在很快:)感謝! – hamstar 2010-06-11 15:15:26

1

150,000行在表格大小方面確實很小。

表格是否正確編制索引?

您是如何做更新的,您是安排和/或限制更新還是讓它一次全部完成?

由於您試圖一次更新太多行而無法讓服務器屏住呼吸,因此最可能發生減速。嘗試限制更新。

+0

我相信這是正確的索引,我沒有創建數據庫,但我認爲,那些做的工作的人很有幫助。更新全部一次完成到非活動數據庫,需要1.5小時(蜘蛛抓取)。然後將表格複製到實時數據庫中,大約需要3秒。之後,網站上的網頁加載速度緩慢。 – hamstar 2010-06-09 22:36:12