2010-02-02 80 views
4

這個問題突然出現在我的腦海裏......我有一張桌子,根據他們的ID將兩張桌子連在一起。該CREATE TABLE看起來是這樣的:我是否也應索引包含在PRIMARY KEY中的列?

CREATE TABLE `ticket_contact` (
     `ticket_id` INT NOT NULL, 
     `entity_id` INT NOT NULL, 
     `notify` INT NOT NULL DEFAULT 0, 
     PRIMARY KEY (`ticket_id`, `entity_id`), 
     KEY `ticket_id` (`ticket_id`), 
     KEY `entity_id` (`entity_id`) 
    ) 

我不知道是否有任何需要,包括最後兩行KEY。它會給我提高速度與下列查詢,或將自動索引PRIMARY KEY內的個別列?

SELECT * FROM ticket_contact WHERE ticket_id=1; 
SELECT * FROM ticket_contact WHERE entity_id=1; 

回答

8

通過PRIMARY KEY創建的索引相同的任何其他(潛在複合物)UNIQUE指數。因此,您不需要爲ticket_id創建單獨的索引,因爲它包含在(ticket_id, entity_id)索引中的主要列中。

如果您通常使用獨立於ticket_id的列進行查詢,則您希望通過entity_id創建單獨的索引。

4

認爲PK和索引只是一種迫使你的記錄排序的方式。數據庫可以比未排序數據快得多地搜索排序數據(日誌與線性時間)。

複合主鍵按給定列的順序排序,因此PK(ticket_id,entity_id)對ticket_id ASC, entity_id ASC進行排序。由於您的PK已經對ticket_ids進行排序,因此它涵蓋ticket_id上的索引。

但是,按entity_id ASC排序而沒有其他列會導致不同的排序順序。如果您需要頻繁查詢entity_id,MySQL將執行索引掃描(搜索每個ticket_id,然後binary_searching匹配的entity_id的結果)。您在entity_id上的單獨索引將使查詢entity_id的速度更快。

相關問題