2017-09-10 60 views
0

我有一個多對多的表,這將有數百萬行。讓我用一個例子來描述我的困惑。多對多索引問題,mysql

例如:

表:car_dealer_rel

選擇:1

columns: car_id: int unsigned, dealer_id: int unsigned 
index on: car_id, dealer_id 

car_id|dealer_id 
-------|--------- 
1  | 1 
1  | 2 
.... 
  • sub-opt:1:這裏我可以在兩列上都有一個索引。
  • sub-opt:2:2列上的一個組合索引。

選擇-2:

一個列的表

col: car_id_dealer_id: varchar:21 
index on: PKI on this single column. 

這裏的想法是把值:car_id.dealer_id和做搜索爲%.xxx and or xxx.%

car_id_dealer_id 
---------------- 
1.1 
1.2 
1.15 
2.10 
... 
... 

百萬的記錄,這將是更快後:

  1. 添加/更新讀/刪除。

我是MySQL的新手,所有幫助表示讚賞。

+0

的firts一個是正確的..never使用組合值。至於第二個樣品中..永遠用分離柱分隔值..你可以輕鬆地添加複合指數 – scaisEdge

回答

0

與第一個

car_id|dealer_id 
-------|--------- 
1  | 1 
1  | 2 

可以easlily創建綜合指數FO雙方

create index ind1 on car_dealer_rel (car_id,dealer_id); 

create index ind2 on car_dealer_rel (dealer_id, car_id); 

的工作非常快

,你可以很容易地在兩個意義上

過濾
where car_id = your_value 

where dealer_id = another_value 

或同時使用

與第二個你不能做到這一點很容易(你需要頻繁的字符串操作,這不讓你使用索引),並在一定條件下可以「做T使用SQL

和更新,插入和刪除的性能保持pratically相同

+0

指數'ind2'不需要因爲即使沒有包含'car_id'列,索引ind1和ind2也可以單獨滿足'car_id'和'dealer_id','car_id'或'dealer_id'的過濾條件。 –

+0

不是真的,因爲firts列可以用在哪裏,第二個用作selectfor ..避免這樣的訪問全表.. – scaisEdge

+0

我需要使用兩列進行搜索。這是多對多的,所以行是唯一的(car_id + dealer_id),但對於給定的列重複值。 – rajeev

0

這取決於你實際使用的查詢,我建議運行EXPLAIN首先,相當多的僞數據,瞭解怎麼樣MySQL將執行您的查詢。

但是,如果你要通過car_id柱單獨或car_iddealer_id查找記錄,您可以使用綜合指數(car_iddealer_id)。

如果您還想通過dealer_id單獨查找,則可以在dealer_id列中添加附加索引。

你一個列的表選項不是很好,因爲

  • 您不能dealer_id快速找到行。

  • 表格架構未標準化。

+0

謝謝....... – rajeev