这个问题突然出现在我脑海中......我有一张桌子根据他们的身份证将两张桌子绑在一起。 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;
答案 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。