2011-04-17 61 views
14

我知道我需要一個主鍵集,並設置任何唯一的鍵作爲唯一鍵,但是什麼是INDEX,我該如何使用它們?在mysql中使用INDEXES最大的好處是什麼?

有什麼好處?優點&缺點?我注意到我可以使用它們,我應該什麼時候使用它?

+2

參考文獻:[Wikipedia文章](http://en.wikipedia.org/wiki/Index_(數據庫)) – 2011-04-17 22:33:59

+0

降價吃了你的括號 – 2011-04-17 22:35:21

回答

1

你不要有一個主鍵。索引(任何類型的)用於加快查詢速度,至少在InnoDB引擎中實施外鍵約束。無論您使用唯一索引還是普通索引(非唯一索引),都取決於您是否希望在鍵中使用重複值。

0

索引可以讓MySQL來查找數據更快。您可以在WHERE條款中使用的列上使用它們。例如,如果您有一個名爲score的列,並且想要查找與score > 5之間的所有內容,默認情況下,這意味着MySQL需要掃描整個表以查找這些分數。但是,如果您使用BTREE索引,那麼找到那些符合該條件的索引會更快地發生。

指數有一個價格:磁盤和內存空間。如果這是一張非常大的桌子,你的指數會變得相當大。

9

優點:

更快地查找結果。這是關於減少磁盤IO的數量的。您可以使用索引結構(如B-TreesHash Indexes)更快地獲取數據,而不是掃描整個表以獲取結果,從而減少磁盤IO的數量(頁面提取)。

缺點:

  • 寫入速度較慢(可能)。您不僅需要將數據寫入表格,還必須寫入索引。這可能會導致系統重新構造索引結構(哈希索引,B樹等),這在計算上可能非常昂貴。

  • 自然會佔用更多的磁盤空間。您正在存儲更多數據。

0

想想這樣:在書中有索引的最大好處是什麼?這是一回事。你有一本稍大的書,但你可以快速查找的東西。在列上創建索引時,您希望能夠在where子句中引用它以快速查找它。

3

思考索引的最簡單方法是思考字典。它有單詞,它有與這些單詞相對應的定義。字典有一個關於「單詞」的索引,因爲當你閱讀一本字典時,你想快速查找一個單詞,然後得到它的定義。一本字典通常只包含一個索引 - 一個索引。

數據庫是類似的。當你在數據庫中有一堆數據時,你會有一些你想要得到的方法。假設您有一個用戶表,並且您經常通過FirstName列查找用戶。由於這是您經常在應用程序中執行的操作,因此您應該考慮在此列上使用索引。這將在數​​據庫中創建一個結構體,如果您願意的話,在該列中進行排序,以便通過名字查找某些內容就像在字典中查找單詞一樣。如果你沒有這個索引,你可能需要查看所有的行,然後再確定哪些具有特定的FirstName。通過添加一個索引,你已經做得很快。

那麼爲什麼不把所有列的索引,並使他們都快?像所有事情一樣,這是一種折衷。每次向表格中插入一行用戶時,數據庫都需要執行它的魔法並對索引列上的所有內容進行排序。這可能是昂貴的。

+0

所以,如果我的表非常大有許多行,最好不要使用它們,只使用PRIMARY KEY,但我的大多數WHERE子句只使用我的PRIMARY KEY。感謝您的回答。 – Basic 2011-04-17 22:41:18

+0

不一定 - 如果它有許多行,並且您確實需要通過主鍵以外的其他方式獲取您的信息,那麼您應該在該列上放置索引。如果人們不斷地通過該專欄獲取信息,那麼它需要很快。 你只是不想隨意添加索引,因爲有後果 - 希望有所幫助! – skaz 2011-04-17 23:26:10

18

簡短回答:
索引加快SELECT's並減緩INSERT's。

通常最好有索引,因爲它們加速select多於它們減慢insert。如果你的索引字段的update一個

UPDATE如果索引字段是WHERE條款和慢下來的東西中使用的索引可以加快速度方式。

你怎麼知道什麼時候使用索引

添加EXPLAINSELECT語句的前面。
像這樣:

EXPLAIN SELECT * FROM table1 
WHERE unindexfield1 > unindexedfield2 
ORDER BY unindexedfield3 

會告訴你多少工作,MySQL將不得不在每個索引字段做。
使用該信息可以決定是否值得添加索引。

解釋也可以告訴你,如果它是更好地下降,指數

EXPLAIN SELECT * FROM table1 
WHERE indexedfield1 > indexedfield2 
ORDER BY indexedfield3 

如果很少選擇行或MySQL決定忽略指數(它是不時)那麼你也可以放棄索引,因爲它放慢你的insert s,但不加快你的select的。

然後它也可能是你的選擇語句不夠聰明。
(對不起,複雜的答案,我試圖保持簡單,但失敗了)。

鏈接:
MySQL indexes - what are the best practices?

+0

我應該如何使用這個查詢?:EXPLAIN SELECT * FROM table1 WHERE indexedfield1> indexedfield2 ORDER BY indexedfield3;我的意思是我知道要在indexedfield1上放什麼,但那些indexedfield2和indexedfield3怎麼樣? – Viscocent 2014-04-30 07:21:36

相關問題