2010-11-14 45 views
0

我有一張3列的表格。該表包含許多原始數據(百萬)。當我從表中選擇行我經常使用以下where條款:MySQL中的索引是否互相干擾?

where column2=value1 and column3=value2 
where column1=value 

要加快select查詢我想聲明列1列2和作爲指標。如果將第二列聲明爲索引,我的問題是不會降低聲明第一列作爲索引的積極影響。

我也想問,如果聲明第二列作爲索引將加快這種類型的查詢:where column2=value1 and column3=value2

ADDEDcolumn1column2,和column3entityattributevalue。這是非常普遍的。作爲實體我使用人,電影,城市,國家等。屬性是類似於「位於」,「出生日期」,「由...生成」等。

+0

如果您告訴我們關於您的餐桌的更多信息,這將有所幫助。 'column1','column2','column3'讓我們不得不猜測約束是什麼。 – Theo 2010-11-14 10:24:44

+0

@Theo,我已通過添加所需信息更新了我的問題。 – Roman 2010-11-14 10:30:03

+0

在我看來,你可能在'entity,attribute'組合中有一個主鍵,但是如果實體/屬性組合沒有多個值。沒有主鍵是可以的,但有時即使跨越所有列也是有用的,因爲它防止插入重複的行。 – Theo 2010-11-14 11:09:04

回答

4

您應該創建支持您查詢的索引。在這種情況下,您希望在column2,column3上一起創建索引(不是兩個單獨索引,而是一個索引用於列的組合)以支持第一個查詢,另一個支持第二個查詢的column1。更一般地說,如果一個查詢使用一組列,爲所有這些列添加一個索引將加速它(儘管當然有很多例外)。

column2的索引將加快查詢column2=value1 and column1=value2,並因此它們會在column2,column3指數(最重要的事情是,column2是在索引的第一列)。

使用索引時,EXPLAIN關鍵字非常有用。用EXPLAIN(例如EXPLAIN SELECT * FROM table)前綴查詢以獲取數據庫如何執行查詢的說明。它會告訴你它是否要使用索引,並在那種情況下使用索引。

+0

我確定你在最後一句中提到「column1」,對吧? – aefxx 2010-11-14 10:12:24

+0

你的意思是我需要把索引放在所有三列上? – Roman 2010-11-14 10:14:09

+0

@羅曼我已經更新了我的答案,希望現在更清楚。簡而言之:不,您應該創建兩個索引,一個使用'column2,column3'(即_one_索引使用_two_列),另一個使用'column1'。 – Theo 2010-11-14 10:21:36

0

看起來你的計劃都沒有奏效。根據我建議在column1上有主鍵和第二個索引column2,column3的where子句。這會加快你的查詢速度。

+0

我無法將主鍵放在第一列,因爲第一列中的值不唯一。 – Roman 2010-11-14 10:13:29

+0

無關緊要,只需添加另一個索引即可。你最終會得到兩個新的索引(「column1」和「column2,column3」)。 – aefxx 2010-11-14 10:14:39

+0

但據我所知「主鍵用於唯一標識表中的每一行」。在我的情況下,不同的行可以具有相同的第一列的值。爲什麼把索引放在第一列是不夠的?爲什麼除此之外,我需要把它作爲「主鍵」? – Roman 2010-11-14 10:21:28