我还应该索引PRIMARY KEY中包含的列吗?

时间:2010-02-02 18:55:42

标签: mysql database-design indexing primary-key

这个问题突然出现在我脑海中......我有一张桌子根据他们的身份证将两张桌子绑在一起。 CREATE TABLE看起来像这样:

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;

2 个答案:

答案 0 :(得分:9)

PRIMARY KEY创建的索引与任何其他(可能是复合的)UNIQUE索引相同。因此,您无需为ticket_id创建单独的索引,因为它包含在(ticket_id, entity_id)索引中的主要列中。

如果您经常使用该列独立于entity_id进行查询,则需要在ticket_id上创建单独的索引。

答案 1 :(得分:4)

将PK和索引视为将记录强制排序的一种方式。数据库可以比排序数据快得多地搜索排序数据(log n vs线性时间)。

复合主键按给定列的顺序排序,因此PK(ticket_id,entity_id)对ticket_id ASC, entity_id ASC进行排序。由于您的PK已经对ticket_ids进行了排序,因此它涵盖了ticket_id上的索引。

但是,按entity_id ASC排序而没有其他列会导致不同的排序顺序。如果您需要经常查询entity_id,MySQL将执行索引扫描(搜索每个ticket_id,然后二进制搜索匹配的entity_id的结果)。 entity_id上的单独索引将更快地查询entity_id。