2014-02-10 156 views
0

所以我在很多小型項目中使用過MySQL,然而,我並沒有接管一個企業級的項目,現在速度很重要,不僅僅是獲得正確的信息。我搜索了很多東西,試圖瞭解索引如何使我的網站更快,我希望進一步瞭解它們是如何工作的,而不僅僅是何時使用它們。字符串SQL索引有用嗎?

所以,我發現自己做了很多SELECT DISTINCTS以獲得所有不同的值,所以我可以填充我的下拉列表。我聽說如果這一欄被編入索引,這將會更快;然而,我不完全明白爲什麼。如果這些列中的值是整數,我完全理解;基本上會創建一個類似於BST的數據結構,搜索時間可能是Log(n);但是,如果我的列是字符串,它如何將一個字符串放入BST?這似乎不可能,因爲沒有度量標準來比較字符串與另一個字符串(就像數字一樣)。看起來索引似乎只是爲該列創建了所有可能值的列表,但似乎搜索仍需要數據庫遍歷每一行,從而使此搜索成爲線性,就像剛剛掃描的數據庫一樣一張正規的桌子。

我的第二個問題是數據庫在索引數據結構中找到正確的值後會做什麼。例如,假設我正在做一個where age = 42的數據庫。因此,數據庫會遍歷數據結構,直到它找到42,但是它如何將查找映射到整行?索引是否有某種與其相關的行號?

最後,如果我正在做這些頻繁的SELECT DISTINCT語句,是否添加索引幫助?我覺得這一定是網站的常見任務,因爲許多網站都有可以過濾結果的下拉菜單,我只是想弄清楚我是否正確地採用了這種方式。

在此先感謝。

+1

爲什麼沒有比較字符串與另一個字符串的指標?當然有:字母順序!這在unicode中甚至是有意義的。 – arkascha

+0

我想提出一個建議:既然你不相信字符串類型列上的索引是有意義的,爲什麼不簡單地寫一個小的測試用例來嘗試呢?你會感到驚訝!也許這有助於相信字符串_do_上的索引是有意義的。 – arkascha

+0

同意了,試試吧。字符串索引可以很好。 – markg

回答

1

您的邏輯是好的,但是,您認爲沒有指標將字符串與其他字符串進行比較是錯誤的。字符串可以按字母順序進行簡單比較,爲他們提供一個可用於構建索引的完美可用的比較度量。

比較字符串需要稍微長一些的時間,然後它會進行整數,但是,無論比較成本如何,索引仍然會加快速度。

但是我想提一下,如果你像使用SELECT DISTINCT那樣多,你的數據庫模式可能存在問題。

您應該瞭解正常化數據庫的情況。我建議從此鏈接開始:http://databases.about.com/od/specificproducts/a/normalization.htm

規範化將爲您提供查詢機制,這可能會大大超過從索引獲得的好處。

+0

非常感謝。這清除了許多事情。不幸的是,這是一個數據庫模式,我沒有真正被允許改變那麼多,所以索引是我能做的所有事情,但是我感謝你進一步理解了這個話題。 –

1

如果你的字符串是類似的小東西,那麼索引將有所幫助。如果您有大量的隨機文本,那麼您可能需要全文索引。如果您不得不使用select進行大量選擇,那麼您的數據庫可能無法正確標準化。你也可以把不同的值放在一個單獨的表中(只有不同​​的值),但這隻有在內容變化不大時纔有用。索引策略對於您的應用程序的訪問模式,數據本身以及表格是如何標準化(或不標準化)是特定的。 HTH