我有两个这样的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上的执行计划 - 引擎是否有任何性能优化我应该注意?谢谢!
答案 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语句,你应该得到一个类似的输出。