2014-11-25 101 views
0

我正在使用h2數據庫來存儲數據。 每個記錄在數據庫中必須是唯一的(唯一的意義在於時間戳,名稱,消息,..的組合不會在表中出現兩次)。因此表中的一列是記錄中數據的散列。爲了加速搜索記錄是否已經存在,我在哈希列上創建了一個索引。確實用給定的散列搜索記錄非常快。 但是這裏有個問題:在開始插入10k條記錄的速度足夠快(大約需要一秒)的時候,當數據庫中已經有一百萬條記錄(需要一分鐘)時,它會非常慢。這可能是因爲新的哈希值需要集成到現有的索引b-tree中。H2:因列索引而導致插入緩慢

有什麼辦法可以加快速度,還是有更好的方法來確保表中數據記錄的唯一性?

編輯:更具體: 比方說,我的記錄是具有以下字段交易:

時間戳,類型,發件人收件人,量,消息

事務應該只出現一次在插入新事務之前,我必須檢查該事務是否已經在表中。由於所有字段的sha 256哈希值都是唯一的,因此我的想法是向放置字段哈希表的表中添加一列「哈希」。在插入新記錄之前,我計算字段的哈希值並查詢表哈希。

回答

0

指數有自己的頭頂。如果你有一個表,你會有很多插入,我建議避免索引,因爲它有散列的頭頂。

我可以知道你是什麼意思 - >表中的一列是記錄中數據的散列?

您可以創建一個唯一的鍵約束(這裏它將是所有這3列中的組合鍵),讓我知道需求,也許我們可以給你一個更簡單的方法做一個更好的解決方案: )

Danyal

+0

我用更具體的例子更新了我的問題。 – user3528637 2014-11-25 13:15:02

0

人,這可能不是查詢所有記錄,檢查它們的副本,然後插入新行:)的好辦法。只要您繼續前進,隨着記錄數量的增加,開銷將增加。

創建一個唯一的鍵約束(檢查http://www.h2database.com/html/grammar.html)這些字段的組合,你不需要計算散列,數據庫將處理散列事情。只要嘗試添加重複記錄,您將得到異常,捕捉異常並將錯誤消息顯示爲重複插入。

創建唯一索引後,將不允許插入任何重複記錄。它非常安全和安全。

+0

感謝您的評論。似乎我必須詳細說明一點: – user3528637 2014-11-25 14:05:47

+0

當我得到一個新的交易時,它不應該立即插入表中。相反,應該檢查它是否是新的,並且如果是這種情況發送給其他感興趣的方。經過一段時間後,將一批新事務插入到數據庫中。 – user3528637 2014-11-25 14:12:42

+0

我理解它,但這將是一個非常巨大的操作,我猜,做一個立即插入和捕捉異常將更快,更可行這裏,而不是加載所有的記錄,然後在應用層執行計算.. – 2014-11-25 14:14:57

0

索引隨機分佈的數據對性能不利。一旦索引中的條目多於緩存中的條目,那麼更新索引就會變得非常慢,特別是在使用硬盤時。這是因爲在硬盤上查找速度非常慢。這與數據的隨機分佈相結合將導致非常差的性能。使用固態硬盤會更好一些,因爲隨機存取讀取速度更快。

+0

其實我不會在查看資源管理器時看不到任何讀取,只有大量的寫入。這只是H2數據庫的一個問題,或者**所有**數據庫共享的一個片狀問題?有數據庫包含數以百萬計的散列,他們如何搜索給定的散列? – user3528637 2014-11-26 10:03:02

+0

他們通常試圖保留所有的哈希值在內存中。否則,基本上每次訪問都會導致至少一次磁盤讀操作,因爲沒有散列的地方。至於寫入,理論上可以通過使用日誌結構化存儲來減少它們;但H2尚未針對這種情況進行優化(除了在添加數據後創建索引時,這種情況應該沒問題)。無論如何,我會避免索引隨機分佈的數據。 – 2014-11-26 10:59:35

+0

更新:我將H2從1.3.175轉換爲1.4.182。這解決了這個問題,在硬盤活動較低的情況下,插入新行的速度更快。 – user3528637 2014-11-26 11:18:51