我在閱讀有關數據庫中的索引。爲什麼需要單獨的索引表
首先,我有我的原始表格。然後我添加另一個表(索引表),每當我在第一個表中添加一行時,我都會努力知道將它插入索引表(按字母順序排列)。然後,當我搜索一些記錄時,我使用索引表,它將我的搜索問題轉換爲O(log)而不是O(n)。
我的問題是以下幾點:爲什麼不在原表中做這種努力?至少如果該表只有一個索引。如果它有更多的話,那麼應用索引表的想法。至少這個想法在我讀過的文獻中從未提及,我想也許有一個很好的理由。
我在閱讀有關數據庫中的索引。爲什麼需要單獨的索引表
首先,我有我的原始表格。然後我添加另一個表(索引表),每當我在第一個表中添加一行時,我都會努力知道將它插入索引表(按字母順序排列)。然後,當我搜索一些記錄時,我使用索引表,它將我的搜索問題轉換爲O(log)而不是O(n)。
我的問題是以下幾點:爲什麼不在原表中做這種努力?至少如果該表只有一個索引。如果它有更多的話,那麼應用索引表的想法。至少這個想法在我讀過的文獻中從未提及,我想也許有一個很好的理由。
這篇文章有一些非常有用的鏈接:indexes in sql server, internal working and structure of indexes
簡短的回答:你的桌子上聚集索引不應該創建一個單獨的映射,因爲它排序原始表本身。其他索引將創建映射到聚集的行id。根據您正在閱讀的數據庫,這可能會有所不同。
這不是通常在數據庫上完成的索引 - 通常一個表有索引,當查詢允許時數據庫服務器將自動嘗試使用最佳索引 - 例如,如果索引了Name
列,如果名稱完全匹配(= 'foo'
),則會使用您的索引;如果您使用特定字符串(LIKE 'foo%'
)開始查詢,它可能會選擇使用您的索引;而如果您在查詢索引列中包含子字符串(LIKE '%foo%'
),那麼它不能使用該索引,並且必須掃描整個表。
我認爲你的回答不能回答我的問題。我同意你所說的一切,但我問的是爲什麼要有另一個索引表,而不是直接在原始表中插入。 – pritzo
我在說「你沒有**另一個**表」 –
也就是說,爲什麼大多數數據庫產品都具有像[聚簇索引]這樣的概念(http://msdn.microsoft.com/zh-cn/library/ms190639(v = sql.105).aspx) –