2015-09-30 50 views
1

我正在創建一個表,它將使用InnoDB存儲引擎在MySQL 5.6中存儲大約1億行。該表將有一個外鍵,將鏈接到約500萬行的另一個表。用獨特的多列索引表格的最佳方法是什麼?

當前表結構:

`pid`: [Foreign key from another table] 

`price`: [decimal(9,2)] 

`date`: [date field] 

pid應該有一個date

什麼是創建這個表索引的最佳途徑只有一條記錄?

選項#1:添加另一列id與AUTO_INCREMENT和primary indexpid列創建唯一索引和date

:兩個字段 piddate

選項#2創建主索引

還是其他選項?

只有我將使用此表上選擇查詢是:

SELECT pid,price,date FROM table WHERE pid = 123 

回答

1

根據你所說的(100M;唯一的查詢是...; InnoDB的;等):

PRIMARY KEY(pid, date); 

,並沒有其他的指標

一些注意事項:

  • 既然是InnoDB中,字段的所有其餘的「聚集」與PK,所以查找通過pid就好像price是PK的一部分。 WHERE pid=123 ORDER BY date也會非常有效。
  • 不需要INDEX(pid,date,price)
  • 添加一個AUTO_INCREMENT沒有任何效果(除了一點排序)。如果你需要需要排序,那麼開始date可能是最好的。
  • 額外的索引減慢插入。特別是UNIQUE個。
1

兩種方法是罰款。我更喜歡有合成主鍵(即帶有附加唯一索引的自動遞增版本)。我發現這是有用的幾個原因:

  • 您可以有一個外鍵關係的表。
  • 您有一個插入順序的指示符。
  • 您可以更改要求,所以如果某些pid s每天允許兩個值或每週只允許一個值,則該表可以支持它們。

也就是說,這樣的列還有額外的開銷。當您訪問數據時,此開銷會增加空間和少量時間。你有一個非常大的桌子,所以你可能想要避免這個額外的努力。

+0

好的,謝謝我會選擇#1 – Badal

+0

如果你打算在索引中包含'date',你可以包括'price'。無論是「pid」,還是全部三列。 –

+0

不,如果我創建一個三列唯一索引,我可能會得到同一日期的重複條目(因爲在同一天可能有兩個不同的價格)。 – Badal

0

我會嘗試用試圖覆蓋查詢的索引,希望MySQL只能訪問索引才能獲得結果集。

ALTER TABLE `table` ADD INDEX `pid_date_price` (`pid` , `date`, `price`); 

ALTER TABLE `table` ADD INDEX `pid_price_date` (`pid` , `price`, `date`); 

選擇第一個,如果你認爲你可能需要選擇在PID和日期在未來,或者第二個使用條件,如果你認爲的條件將是最有可能的超過pid和價格。

這樣一來,該指數的所有數據的查詢需求(PID,價格和日期)及其在右列(PID)

順便說索引,請務必使用EXPLAIN來看看查詢規劃將真正使用整個索引(看看key和keylen輸出)

+0

如果我創建一個三列索引,你不覺得它會減慢插入? – Badal

+0

當然,每個添加的索引都會減慢插入。這是一個瓶頸所在。 – mamuso

相關問題