2011-12-14 78 views
3

我在多個問題上看到大量關於獨特約束的問題,但沒有一個符合我特別尋找的問題。如果這是一個重複的,我表示歉意。MySQL:獨特的約束多列性能優化

我有一個表,就是: tableA_id tableB_id

我的主鍵是兩個表的唯一約束,和我有兩個列的索引。兩者也是其受尊敬的表格的主要關鍵。

如果tableA可能說有10,000,000行,而表B有200,000行,那麼TableB在這個約束中的可能性要小得多。令人傷心的是,當我將TableB作爲第一列時,它更加優化,因爲搜索TableA的次數更少(如果是的話),或者它沒有區別,因爲它沒有先搜索一次另一方面,而不是一個一個地看着兩者。

預先感謝

+0

你的意思是「對兩列**的唯一約束」而不是「兩個*表*」? – 2011-12-15 09:06:48

回答

2

它通常建議把一個柱,用多個不同的值在左側的複合索引。這導致更具選擇性的指數,這對於找到具體的價值更好。

一個報價表MySQL docs

要考慮排除行。如果有 多個索引之間進行選擇,MySQL通常使用的是發現 最小的行數(最有選擇性的指數)

的索引,但我有,你似乎是爲了要在優化失敗的印象插入表格。如果您對錶的寫入次數多於讀取次數,且大部分寫入都是重複的,那麼您可能是對的。但即使在後一種情況下,MySql將需要檢查另一列的唯一性。因此,首先放置更明確的值列更好。

0

從你的描述我假定你具備以下條件:

UNIQUE (tableA_id, tableB_id) 
INDEX (tableA_id) 
INDEX (tableB_id 

在這種情況下,上tableA_id的單列索引是沒有必要的,因爲這可以讓使用的那一個,也可以使用該索引的語句來自主鍵。所以你至少可以刪除tableA_id上的單列索引。

我不認爲MySQL的優化器足夠智能,可以使用包含WHERE tableB_id = 42的語句的PK索引。

因此,如果您在報表中使用該ID作爲單個標準,那麼您可能希望保留該列上的單列索引(如果)。

如果您始終使用這兩個ID查詢該表,則不需要保留單列索引。