我在做linux上的c編程,遇到了一個需要非常快的查找速度的問題。'固定數據庫'的快速索引格式
如果一個表,像一個正常的MySQL表,如下所示:
ID name age sex score_a score_b score_c date
,這是不變,這意味着一旦該表中創建並沒有更新被允許。它只用於閱讀。由於它是不變的,所以我猜想必須有一個更好的索引格式,以便通過條件(如年齡,分數等)快速查找,而不是在大多數數據庫中爲索引實現的「B樹索引」。
我在做linux上的c編程,遇到了一個需要非常快的查找速度的問題。'固定數據庫'的快速索引格式
如果一個表,像一個正常的MySQL表,如下所示:
ID name age sex score_a score_b score_c date
,這是不變,這意味着一旦該表中創建並沒有更新被允許。它只用於閱讀。由於它是不變的,所以我猜想必須有一個更好的索引格式,以便通過條件(如年齡,分數等)快速查找,而不是在大多數數據庫中爲索引實現的「B樹索引」。
查看我對你的問題的評論。總之,如果數據是不變的,我會假設你需要運行的查詢也是相當穩定的?
大多數現代RDBMS'支持某種形式的查詢緩存。如果你沒有,你可以將你的查詢結果緩存在memcached之類的東西中。生成緩存的速度會很慢,但如果緩存查找保留在本地,則與索引查找相比,它將非常快速 - 通常爲O(1)。
「快」的意思是比查詢緩存關閉的大多數數據庫索引(例如MySQL)更快 – 2012-03-13 05:29:53
我需要比這更具體的東西。你的接受標準是什麼?目前「緩慢」造成的更大問題是什麼? – 2012-03-16 17:34:55
你打算做基於範圍的搜索('年齡介於10到12,13和15等','介於40到60,61和70等之間')或單值搜索('名字是昆汀史密斯')還是兩者?對於單值搜索,散列是合適和快速的;特別是基於範圍的搜索,B-tree及其變體往往是最好的。
您正在查看原始數據每行50個字節的區域,因此您需要處理1/2 GB到15 GB的數據。如果它位於該範圍的上端,那麼您將需要一臺大型機器來保持內存中的普通數據,更不用說索引了。在範圍的較低端,它完全在可信範圍內。假設您爲每個列編制索引,那麼您的索引可能會佔用比原始數據更多的空間(可能多50%)。當然,名稱索引將是最大的。如果您可以將ID列用作記錄數組的索引,那麼ID列可能不需要索引,但數據中可能存在差距,因此無論如何都最好對其進行索引。
有許多基於文件的常量數據庫也可以考慮。 搜索計算器或谷歌或必應和你「常量數據庫」會發現一些這樣的:
MCDB https://github.com/gstrauss/mcdb/(對此我的作者)
東京內閣 http://fallabs.com/tokyocabinet/
hamsterdb http://www.hamsterdb.com
...還有其他的。
看起來哈希將是唯一的方法。 – PasteBT 2012-03-13 03:41:30
@PasteBT哈希不支持過濾,我想這可能不適合我 – 2012-03-13 03:45:15
我需要更多信息。 「快」和「不夠快」是什麼意思?你正在運行什麼類型的查詢,你的過濾器有多複雜?你是否一遍又一遍地運行相同的查詢,或者它們是高度可變的? – 2012-03-13 05:18:17