2008-11-15 21 views
6

我有以下表結構在同一列上有一個唯一的正常索引有多大錯誤?

CREATE TABLE `table` (
    `id` int(11) NOT NULL auto_increment, 
    `date_expired` datetime NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `foreign_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `date_expired` (`date_expired`,`user_id`,`foreign_id`), 
    KEY `user_id` (`user_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

正如你會發現,我對USER_ID重複的索引:date_expired & user_id。我當然想要唯一索引,因爲我想確保數據是唯一的。

重複索引的原因是因爲沒有user_id索引,我的主要搜索查詢需要4秒鐘。多餘的索引需要1秒。查詢將加入user_id的表格並檢查date_expired

該表只有275條記錄。

  • 在同一領域有一個獨特的和正常的索引有多糟?
  • 當表格純粹是ID時,索引大於數據有多糟糕?

回答

8

我相信,如果你創建了獨特的指數(user_iddate_expiredforeign_id),你會得到具有隻是唯一索引user_id正常指數相同的利益。 MySQL可以使用任何索引的第一列以與user_id上的索引相同的方式減少聯接中的行數。

有關更多信息,請參閱MySQL's index documentation

您是否指代架構中其他位置的id auto_increment列來節省空間?由於您的唯一索引涵蓋了表中的所有其他列,因此它本質上是主鍵,如果不是,則可以將其刪除。

您可以通過在EXPLAIN前加上前綴來查看您的查詢正在使用什麼鍵。

+0

優秀,我不知道!這就是我需要做的。 – 2008-11-15 07:00:34

1

有幾個包括一個字段的索引根本沒什麼不好(基本上,它們的確索引不同的東西)。它對寫入性能有輕微的影響,但這是每個索引都有的典型折衷。 如果空間很便宜,索引佔用空間比數據本身還要多。在你的情況下,它應該是便宜的,因爲你有一個非常少量的條目。

我會問你的立場的問題是:這樣一個小表的索引如此嚴重影響我的查詢運行時?也許你做錯了什麼(我想這個表中有很多可能多餘的查詢),因爲一個單一的應用程序應該不在這個時間範圍內,只有這麼少的條目)。

+0

查詢中有20個表。這是在移除時發揮最大作用的那個。 – 2008-11-15 07:04:05

3

我不明白重複索引是什麼意思。你必須在表格中三項指標:

  1. 一主鍵「ID」(這意味着唯一的)
  2. 另一個獨特的一個爲「date_expired」,「USER_ID」相結合,「foreign_id」
  3. 而第三個在「user_ID的」唯一

所以沒有重複,你有三種不同的指標那會做不同的事情。您需要編號3以加快與您所看到的user_id相關的查詢。所以這個特定的表沒有問題,你沒有重複任何東西。關於第二個問題,這取決於你的需求,但肯定不是不好在索引中佔用的空間比在數據中佔用的空間要多。

如果有一個UNIQUE('user_id')和一個KEY('user_id')(我甚至不確定MySQL是否允許這樣做)會有什麼不好,因爲一個索引會包含其他,沒有什麼可以獲得的。