2011-04-02 40 views
0

我想將數據(作爲檔案)存儲在兩個獨立的列表中,一種是LIFO堆棧,其中新數據剛剛被推到頂部,另一個按照時間上獨立的值排序。數據可能會在稍後的時間點被回收,但我通常只對最高的N值感興趣。兩個列表都可以變得非常長,但包含非常簡單的值(具有優先級的文檔ID)。有沒有一個數據庫來有效地實現這種模式?我聽說HBase會對存儲進行排序,對於這種應用程序它會有用嗎?LIFO /排序的數據庫設計模式

至少LIFO存儲可以作爲純文件來實現。這是明智的嗎? 或者是這種關於復位速度過早優化的問題,即SQL中是否有命令可以通過插入/按值排序來首先檢索N個。或者我應該碎片/分頁?

+0

我們正在談論的記錄數(「非常長」)是多少? – 2011-04-02 21:45:18

+0

數以萬計到數千萬。 – werg 2011-04-04 07:45:43

回答

1

行或「元組」如果你喜歡,具體是而不是在關係數據庫中排序。它被認爲是一個實現細節。當然,我們經常需要對行進行排序,但是當我們查詢數據時,我們不得不這樣做,而不是當我們存儲它時。

我不知道hbase,但我注意到它是免費的,所以如果你可以考慮MySQL的替代方案,這裏有一種方法可以做你想做的。

使用自動遞增主鍵創建InnoDB表。 InnoDB表集羣在主鍵上,這意味着這些行按鍵存儲。由於您使用了自動遞增鍵,所以新行總是具有更高的值,並且按順序添加的行將彼此「靠近」存儲。這些屬性可以快速恢復X最新或最舊的行,因爲它們可能位於相同的數據頁上(減少I/O)。

這將是這樣的:

create table mytab(
    id  int not null auto_increment 
    ,the  int 
    ,rest  varchar 
    ,of  char 
    ,your  tinyint 
    ,columns varchar 
    ,primary key(id) 
)Engine=InnoDB; 

要獲得10個最新的行補充說,你會質疑它想:

select * 
    from mytab 
order 
    by id desc 
limit 10; 

請注意,即使你刪除的行中, ID將繼續增加。所以如果MAX(id)是5000,這並不意味着你有5000行。

+0

認識到訂單與表級無關是至關重要的,讓RDBMS解決它。 – 2011-04-04 09:51:25