2014-04-03 105 views
0

我有一個表'日誌'其中我們記錄訪客的歷史。我們每天有一千四百萬次綜合瀏覽量,所以我們一天內在表中插入1400萬條記錄,下午流量最高。從那些日子她念叨我們所面臨的問題,爲重複鍵輸入「身份證」,而據我不應該是這樣,因爲ID是自動遞增場,我們沒有明確傳遞ID在插入查詢。以下是詳細信息Mysql:與主鍵自動增量重複鍵錯誤

logging (MyISAM) 
---------------------------------------- 
| id     | int(20)   | 
| virtual_user_id | varchar(1000) | 
| visited_page   | varchar(255) | 
| /* More such columns are there */ | 
---------------------------------------- 

請讓我知道這裏有什麼問題。在MyISAM中保留表格是一個問題。

+2

你在桌子上還有什麼獨特的鑰匙?你在桌上有觸發器嗎? –

+1

併發查詢可能是你的情況(所以你需要發佈更多的細節|) –

+1

目前表中最大的ID是什麼(SELECT MAX(id)FROM logging)? –

回答

3

問題1:你的主鍵

http://dev.mysql.com/doc/refman/5.0/en/integer-types.html

int的最大尺寸,不管大小,你給它是2147483647大小,兩倍多,如果無符號。 這意味着你每隔153天就會遇到一個問題。

爲了防止您可能想要將數據類型更改爲unsigned bigint。 或甚至更可笑的大卷,即使是unix時間戳+ microtime作爲組合鍵。或者完全不同的數據庫解決方案。

問題2:實際的錯誤

這可能是併發性,即使我沒有找到非常合理的。 您必須爲此提供插入ID /錯誤。你使用交易嗎?

另一種可能性是腐敗的表格。 不知道你的MySQL版本,但是這可能工作:

CHECK TABLE tablename 

看看是否有任何投訴。

REPAIR TABLE tablename 

一般建議:

這是要插入到數據庫中的數據的合理數量,並沒有它無論如何放緩都記錄下來太多了? 我想知道你的數據庫如何執行鎖定和所有在刪除期間例如一個alter table。

做完全正確的方式取決於哪個我不知道目標和系統的要求,但這裏有一個想法:

日誌行到日誌。在我們自己的時間導入日誌文件。當數據庫遇到問題或者需要做一些可以鎖定所有內容的大型操作時,請不要打擾訪問者的錯誤或延遲。

+0

記錄數量絕不應該是一個問題(至少不是這個數量)。已經在每分鐘記錄+50.000個插入記錄的網站上正常運行,mysql也是如此。 OP應該考慮1)我真的需要一個autoincremental id嗎?有什麼好處,是不是我們需要的時間戳? 2)我是否需要不斷地寫db數據?出於什麼目的。爲什麼不使用簡單的日誌文件,對其進行刷新並使腳本每天一次將記錄插入數據庫日誌表中,每小時一次或類似? – davidkonrad

+0

根據我的經驗(每天〜2M日誌條目,10k平均行大小)MyISAM表現非常好。我沒有遇到任何併發/鎖定或性能問題。目前唯一的問題是有足夠的磁盤空間... – Vatev

+0

我看到另一個SO問題,提問者竟然有另一個腳本,做了一些自動增加邏輯本身造成的麻煩。最大(編號)+ 1.可能不是這種情況,但值得消除的一種可能性... – Arnout