2012-04-06 37 views
1

我正在編寫一個需要很多寫入的應用程序(高達每秒100個)。我也打算經常閱讀這張表。但是,由於重複鍵索引,我將進行的大部分寫操作實際上會失敗。這是打算。失敗的寫入是否會消耗MySQL表資源?這是不好的做法嗎?MySQL:許多寫入表的目的是失敗。餿主意?

+0

我只是想知道爲什麼寫入會失敗 - 你能給出進一步的細節,你到底想要存儲什麼?我擔心的是,所有索引都試圖檢查唯一性約束可能會導致一個鎖會阻止讀取線程。有些東西你可以避開,但是當它涉及索引時,它可能非常糟糕。 – 2012-04-06 01:41:07

+0

當然。我正在設計一個內容聚合器,它將從數量不斷增加的數據源中提取數據。對於每個數據記錄,我將有一個URL和一個user_id。我不希望在任何記錄中有任何重複的URL和user_id實例,但我確實希望會有許多潛在的重複實例存在的情況。我的想法是讓索引的自然功能爲我過濾這項工作。但似乎我需要找到另一種方式,如果它會鎖定閱讀的表(這也是重要的) – phirschybar 2012-04-06 01:59:11

回答

3

失敗的寫操作會消耗系統資源,因爲需要諮詢表索引以確定是否違反約束。至於這是否是不好的做法 - 有意識地拋出很多預計會失敗的寫入似乎有點不尋常,但另一方面,RDBMS的工作是存儲,組織和檢索數據。數據庫嘗試INSERT的速度會更快,這將違反唯一約束並且會比首先查詢以找出密鑰是否可以被應用程序代碼插入然後插入它(您的仍需需要檢查約束在RDBMS上)。

+1

索引上的讀取是否會導致鎖定升級,從而使任何預定的閱讀器等待,直到索引不是。我猜'骯髒「是最好的詞。 – 2012-04-06 01:42:10

+0

@RussC - 是的,這正是我想知道的。 – phirschybar 2012-04-06 02:00:41

+0

http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html InnoDB存儲和鎖定文檔似乎暗示不會使用鎖升級。 – 2012-04-06 02:08:40

1

通常,應用程序具有一些業務規則抽象層,其中完整性問題在概念上被定義;如果是這樣,大多數開發人員都會期望驗證發生在那裏。 OTOH如果這是一次性實用程序,或者您將永遠是唯一的開發人員,它將會工作。與閱讀索引字段相比,黑客可能不會購買任何顯着的效率提升,並且這是一個處理錯誤陷印和移植的不愉快的地方 - 除了你以外,這不是一個錯誤。 (有點像「它不是一個錯誤,它是一個功能......」)