2010-02-02 43 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的速度更快。

相关问题