2012-03-24 53 views
1

數據庫存儲員工的姓名,年齡,工資和地址。如何設計一個數據庫來有效地支持多重鍵查詢?

我知道如果是單鍵查詢,那麼B +樹就是選擇。 多重鍵查詢怎麼辦?例如,我想知道姓氏爲Smith,年齡大於40的所有員工。如何有效支持這種查詢?

我目前的想法是爲每個鍵創建一個B +樹,這會花費額外的空間。 另外我需要找到每個B +樹查詢返回的結果的交集,並且這會花費額外的運行時間。

我是新來的數據庫,任何反饋意見。

謝謝!

回答

1

基本方法通常是爲您需要的每個屬性創建索引,然後從每個屬性獲取結果並進行交集,就像您提到的一樣。

+0

謝謝!任何更好的方法來跳過交叉部分? – jerry 2012-03-25 00:04:37

+1

如果你確切地知道你要問什麼查詢,你可以做一些巧妙的排序。如果你按照名字創建和索引,並且相同的名字按照年齡排序,那麼一旦你得到你的史密斯,就可以很容易地選擇年齡> 40的部分。如果你選擇更多的名字,你可以合併排序根據年齡和再次,容易地選擇部分。 – tchap 2012-03-25 00:11:39

0

按B +樹,我假設你的意思是創建索引。一般規則是隻在密鑰95%唯一時創建索引。一些查詢優化器會忽略不遵循此規則的索引。這些無用的索引花在插入和空間上的時間,應該避免 - 他們也可以混淆一些優化器。

+1

95%獨特,你的意思是每100個值只有5個副本?我不能不同意更多,取決於所需的數字索引可能甚至表明反轉該數字。如果在列中有一個1k行表,並且列中有10k個可能的值,那麼每個值的平均值爲10k個記錄,即表的0.01%。你建議掃描整個表格而不是一小部分。 – Ben 2012-03-24 23:38:50

+0

正確。 95%。我不是在暗示它,而僅僅是關於優化者遵循的規則。我沒有把這個數字拿出來,所以我建議你在宣佈它不真實之前做更多的研究。真正表明,b-tree會產生足夠的開銷來證明索引查找的表掃描。 – 2012-03-25 00:12:53

+0

我很抱歉,但我不能同意;我認爲你有這個錯誤的方式。如果一個值超過列的5-10%,那麼是的,大多數優化器會忽略它,因爲它更快地進行全表掃描,即每100個值小於10到20個值。我們當然可以完全交叉討論目的關於不同的RDBMS ... – Ben 2012-03-25 00:27:08

1

我認爲複合指數會是最好的選擇。這將是一個存儲名稱和年齡數據的索引。所以當遍歷樹時,在找到匹配的名字後,等待的結果將是所有史密斯的,也將按年齡排序。

因此,總成本將是找到第一史密斯所需的時間加上找到年齡在40歲以下的史密斯所需的時間。

+0

謝謝!但是如果你不知道什麼樣的問題會在事前看起來像呢?例如,我需要知道所有在加利福尼亞州的員工,年齡大於35歲,薪水> 1000。複合指數解決方案在這種情況下效果不佳。 – jerry 2012-03-25 06:26:44

相關問題