2009-05-17 27 views
0

我正在開發一個聊天應用程序。我想把所有東西都記錄在一個表格裏(即「誰說什麼,什麼時候說什麼」)。 我希望在不久的將來,我會有成千上萬的行。 我想知道:什麼是優化表格的最佳方式,知道我會經常插入行並且有時會進行分組閱讀(即,顯示來自用戶的整個對話(看他/她登錄/開始聊天時的樣子)看他什麼時候退出然後顯示整個對話))。在具有多行的表上進行MySQL速度優化:處理它的最佳方法是什麼?

此表應該能夠處理(我希望雖然!)許多行。 (每天15000 /天=> 4,5 M每月=>在年底> 54 M行)。

超過15天的對話可能被歷史化(但我不知道該怎麼做才能做到)。

有什麼想法?

回答

1

5400萬行不是很多,特別是一年以上。

如果您打算週期性地旋出大量數據,我會推薦使用MyISAM和MERGE表。由於您不會刪除或編輯記錄,只要併發性設置爲1,就不會有任何鎖定問題。插入將始終添加到表的末尾,因此SELECT和INSERT可以同時發生。所以你不必使用基於InnoDB的表(可以使用MERGE表)。

你可以每個月有一個表,命名爲data200905,data200904等。你的合併表將包括你需要搜索的所有基礎表。插入是在合併表上完成的,因此您不必擔心更改名稱。當需要旋出數據並創建新表時,只需重新聲明MERGE表。

您甚至可以根據季度,年份等創建多個MERGE表。一個表可以用於多個MERGE表。

我已經在每月添加3000萬條記錄的數據庫上完成了此設置。

+0

謝謝,那就是我一直在尋找的。 我打算這樣做:每個「新」月份,我創建一個名爲CHAT \ _YYYY \ _MM的新表格:這將是我要做所有插入的表格。 我將創建一個「全局」表,它將成爲「合併MySQL表」(如果它存在,首先將其破壞)。 再次感謝您! – 2009-05-18 09:24:58

4

我對你們兩個建議:

  1. 如果你期待大量寫入 的幾乎沒有低優先級的讀取。那麼你的 更好用盡可能少的 索引。索引將 使插入更慢。只添加你真正需要的東西。
  2. 如果日誌表 打算越來越大 加班,您應該考慮日誌 輪換。否則,你可能會因爲一個巨大的損壞表而結束 。
2

Mysql的處理非常龐大的數據集的操作非常出色,只需要很少的標準數據庫調整和索引。我運行了一個在數據庫中有數百萬行的網站,並且能夠在mysql上很好地運行它。

Mysql確實有一個"archive" table engine option用於處理許多行,但缺乏索引支持將使它不適合您,除了歷史數據。

索引創建將是必需的,但您必須平衡它們,而不是僅僅因爲可以創建它們。它們將允許更快的查詢(並且對於大型表上的可用查詢將是必需的),但是您擁有的索引越多,插入的成本就越高。

如果您只是查詢您的「用戶」ID列,那麼索引就不會有問題,但如果您希望對郵件進行全文查詢,您可能只想考慮索引用戶在mysql中使用列,並使用類似sphynxlucene的全文搜索,因爲在mysql中進行全文搜索並不是最快和顯着減慢插入時間。

0

您可以使用兩個表格處理此問題 - 一個用於當前聊天記錄和一個存檔表。在一段時間結束時(一週,一個月或一天,具體取決於您的流量),您可以將當前聊天消息歸檔,將其從小表中刪除並將其添加到歸檔中。

通過這種方式,您的應用程序將處理最常見的情況 - 查詢當前聊天狀態,這將非常快速。

對於像「上個月說的是什麼」這樣的查詢,您將查詢歸檔表並且需要花費更長的時間,但這是可以的,因爲不會有太多這樣的查詢,並且如果有人這樣做像這樣搜索,他會願意再等幾秒鐘。

根據您的使用情況,您可以擴展此原則 - 如果在過去6個月內會有大量查詢聊天消息的情況 - 將它們存儲在單獨的表中。

(針對完全不同的領域)類似的原理是由.NET垃圾收集器有短暫的對象,長期生活的對象,大對象不同的存儲使用等

相關問題