2012-03-13 42 views
2

我在做linux上的c編程,遇到了一個需要非常快的查找速度的問題。'固定數據庫'的快速索引格式

如果一個表,像一個正常的MySQL表,如下所示:

ID name age sex score_a score_b score_c date 

,這是不變,這意味着一旦該表中創建並沒有更新被允許。它只用於閱讀。由於它是不變的,所以我猜想必須有一個更好的索引格式,以便通過條件(如年齡,分數等)快速查找,而不是在大多數數據庫中爲索引實現的「B樹索引」。

+2

看起來哈希將是唯一的方法。 – PasteBT 2012-03-13 03:41:30

+0

@PasteBT哈希不支持過濾,我想這可能不適合我 – 2012-03-13 03:45:15

+0

我需要更多信息。 「快」和「不夠快」是什麼意思?你正在運行什麼類型的查詢,你的過濾器有多複雜?你是否一遍又一遍地運行相同的查詢,或者它們是高度可變的? – 2012-03-13 05:18:17

回答

0

查看我對你的問題的評論。總之,如果數據是不變的,我會假設你需要運行的查詢也是相當穩定的?

大多數現代RDBMS'支持某種形式的查詢緩存。如果你沒有,你可以將你的查詢結果緩存在memcached之類的東西中。生成緩存的速度會很慢,但如果緩存查找保留在本地,則與索引查找相比,它將非常快速 - 通常爲O(1)。

+0

「快」的意思是比查詢緩存關閉的大多數數據庫索引(例如MySQL)更快 – 2012-03-13 05:29:53

+0

我需要比這更具體的東西。你的接受標準是什麼?目前「緩慢」造成的更大問題是什麼? – 2012-03-16 17:34:55

1

你打算做基於範圍的搜索('年齡介於10到12,13和15等','介於40到60,61和70等之間')或單值搜索('名字是昆汀史密斯')還是兩者?對於單值搜索,散列是合適和快速的;特別是基於範圍的搜索,B-tree及其變體往往是最好的。

您正在查看原始數據每行50個字節的區域,因此您需要處理1/2 GB到15 GB的數據。如果它位於該範圍的上端,那麼您將需要一臺大型機器來保持內存中的普通數據,更不用說索引了。在範圍的較低端,它完全在可信範圍內。假設您爲每個列編制索引,那麼您的索引可能會佔用比原始數據更多的空間(可能多50%)。當然,名稱索引將是最大的。如果您可以將ID列用作記錄數組的索引,那麼ID列可能不需要索引,但數據中可能存在差距,因此無論如何都最好對其進行索引。