带有额外列的SQL PK查找

时间:2011-12-25 00:18:06

标签: mysql sql primary-key

我有两个这样的MySQL表:

User
 Id (PK, auto-increment integer)

Subscriber
 Id (PK, auto-increment integer)
 OwnerId (FK to User.Id)
 Name

由于我正在对PK进行查询,这两者之间是否存在性能差异:

UPDATE Subscriber SET Name = 'John' WHERE Id = 20;
UPDATE Subscriber SET Name = 'John' WHERE Id = 20 and OwnerId = 50;

理想情况下,我还希望将OwnerId作为额外的预防措施(它是一个多租户应用程序)。这有必要吗?

在性能方面(假设我按顺序保留WHERE条件 - 首先使用PK)我如何对此进行基准测试,或者查看MySQL上的执行计划 - 引擎是否有任何性能优化我应该注意?谢谢!

2 个答案:

答案 0 :(得分:2)

虽然添加额外的过滤器不是必要,但存在差异

UPDATE Subscriber SET Name = 'John' WHERE Id = 20 and OwnerId = 50;

Subscriber.Id是主键,因此它具有唯一值,而WHERE Id = 20子句只能选择一行。

如果AND OwnerId = 50不应该是50的值,则此示例中附加条款Subscriber.OwnerId可能会影响禁止更新在同一行。

虽然这与性能几乎无关(主键被索引,索引搜索在任何一种情况下都会返回一行),但对于大多数用例来说,它也没有多大意义。

您可以使用EXPLAIN测试执行情况。 More info in the manual

答案 1 :(得分:1)

由于你在where子句中有PK,两个语句都会更新同一行。如果另一个作业可以修改搜索ID和更新的SELECT语句之间的行,则只能从额外的预防措施中获益。如果在创建订阅服务器后从未更改OwnerId,则可以忽略UPDATE语句中的OwnerId。

您可以使用EXPLAIN关键字获取SELECT语句的执行计划(请参阅MySQL Documentation)。要查看更新使用的内容是不可能的。但是如果你使用相同的字段和相同的WHERE子句创建一个SELECT语句,你应该得到一个类似的输出。