我有两个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上的执行计划-引擎是否有任何性能优化,我应该知道?谢谢!
虽然不需要添加额外的过滤器,但是还是有区别的。
UPDATE Subscriber SET Name = 'John' WHERE Id = 20 and OwnerId = 50;
Subscriber.Id
是主键,因此它有唯一的值,并且子句WHERE Id = 20
只能选择一行。
如果50
不应该是同一行中Subscriber.OwnerId
的值,则本例中附加子句AND OwnerId = 50
的唯一可能的效果是禁止UPDATE。
虽然这与性能几乎没有关系(主键被索引,索引搜索在任何情况下都会返回单行),但对于大多数用例来说,它也没有太大意义。
你可以用EXPLAIN来测试执行。
由于在where子句中有PK,两个语句将更新同一行。只有当另一个作业可以修改搜索ID的SELECT语句和更新之间的行时,您才能从额外的预防措施中获益。如果您在创建订阅后从未更改OwnerId,则可以从UPDATE语句中忽略OwnerId。
你可以用EXPLAIN关键字获取SELECT语句的执行计划(参见MySQL文档)。不可能直接看到您的更新使用了什么。但是,如果使用相同的字段和相同的WHERE子句执行SELECT语句,则应该得到可比较的输出。