2011-08-28 46 views
4

我正在研究需要在MySQL表中保存頁面的每個視圖日誌的系統。如果訪問者在過去24小時內未訪問過該頁面,則該視圖將僅被記錄。我想知道如果這樣做會在性能和數據庫大小方面造成很大的問題。在每個頁面視圖中插入數據庫行

需要這樣做的網站平均每天約有60,000次獨特的綜合瀏覽量,因此每天新增約6萬個新行(每2秒鐘不到1個)。該表只有3列:i_id,ip_address,timestampi_id是另一個表的外鍵。

表格將在每天結束時使用CRON腳本清除。

這樣做會不會有數據庫緊張?例如,如果網站的流量飆升(定期執行),則每天可能會觸發超過200,000次綜合瀏覽量,這意味着每秒超過2次查詢。

回答

6

一般約定是在審計表上沒有約束條件(主要的,外部的等),當然不是索引 - 所有上述都會減慢插入。

批量插入將是工作考慮 - 批處理插入以降低數據庫所需的連接數量,操作涉及的時間量(一個vs多個)。此外,如果爲此寫入事務日誌 - 儘量減少寫入事務日誌,因爲如果希望能夠在某個時間點重新生成數據庫,則需要寫入IO以影響數據庫。

我沒有看到在一天結束時清除記錄 - 兩天內發生的流量怎麼樣? MySQL partitioning would likely be a better idea

+0

清除記錄的要點是,那麼他們將被提交到一份報告中,並且之後將不再需要他們。 – John

+2

@John:這是你的系統,但能夠按月份,年份,時間進行聚合將爲你的系統提供更多的價值。 –

+0

那麼,這取決於我認爲的系統:P但是在這種情況下,確實沒有必要在一天後保留數據。謝謝! – John

2

你的問題不是每天瀏覽量。您必須考慮在高峯時段每秒需要瀏覽多少次綜合瀏覽量。如果瀏覽量均勻分佈,並且每秒只有2次綜合瀏覽量,那麼在平均非共享服務器中,這不會成爲問題。

但它無法確定沒有更多的數據,就像它是您使用,真正的頁面加載配送等

+2

+1每秒查詢2次是完全不重要的負載。 –

+1

假設數據庫也在爲網站提供內容,那麼比第二個/ etc中的統計信息插入要多得多。 –

-1

硬件我覺得你應該:

  1. 刪除外鍵。在這種情況下,這似乎是多餘的。當您在每個INSERT/UPDATE/DELETE數據庫上使用FK時,將花費額外的資源來檢查表數據的完整性。對於日誌記錄來說沒有必要。我們需要性能和快速響應
  2. 使用myisam。 MyIsam引擎更簡單,並且它不會像資源在Innodb中所做的那樣將資源花費在諸如事務日誌記錄,日記等其他事物上。
  3. 使用INSERT DELAYED插入和清除索引不是針對一行,而是針對批處理。查看更多信息http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html。在每個插入查詢db執行一些操作,其中一個是刷新索引。如果您運行20個查詢,則會進行20次刷新。 INSERT DELAYED批量挑選查詢並運行它們,就像一個查詢。所以你只有一次沖水。
+0

'INSERT DELAYED'可能不適合在此處進行日誌記錄,他需要插入的行才能立即對其他會話可見,以防止發生下一次插入 - DELAYED INSERT不會給予任何時間保證 – Crack

+0

唯一鍵和INSERT DELAYED IGNORE應該修復此問題問題。 –

+1

爲什麼使用我的ISAM?它鎖定整個表達到插入意義插入不能同時發生。 InnoDB使用行級鎖定。 –

0

只要確保您的表具有適當的選擇索引。數據庫管理系統可以承受的遠不止這些。

+0

審計表通常是大量插入/等,低讀取,所以索引中很少或沒有值。並且索引減慢插入... –

+0

如果John想要檢查給定的用戶是否最近訪問了他的網站,並且我沒有看到通過cookie完成的指示器,那麼他們是必需的 – Crack

-2

你可能會想要確保你的mysql集羣已經過優化,並且可能會有壓力,只要確保它可以爲這樣的命中做好準備。

2

幾點意見:

  • 確保這是一個InnoDB表。 MyISAM爲每個插入或更新鎖定整個表,而InnoDB使用行級鎖定。
  • 使用適合每列的最小數值數據類型。
  • 每秒兩個查詢? MySQL在每天早餐前吃兩次查詢。說真的,你應該能夠承受數百人。
  • 如果您仍然擔心,請確保您使用MySQL 5.1或更高版本,因爲它可以在InnoDB表中實現更好的併發性。
  • 我希望只能通過代碼和約定強制執行'外部'鍵,而不是嚴格的限制,因爲這會降低插入速度。
相關問題