SQL PK Lookup с дополнительным столбцом - PullRequest
1 голос
/ 25 декабря 2011

У меня есть две таблицы MySQL, подобные этим:

User
 Id (PK, auto-increment integer)

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

Поскольку я делаю запросы на ПК, есть ли разница в производительности между этими двумя:

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

В идеале я хотел бы также передать OwnerId в качестве дополнительной меры предосторожности (это мультитенантное приложение). Это необходимо?

С точки зрения производительности (при условии, что я поддерживаю условия WHERE в порядке - сначала с PK), как я могу сравнить это или увидеть план выполнения на MySQL - существуют ли какие-либо оптимизации производительности, которые делает движок, о которых я должен знать ? Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Хотя для добавления дополнительного фильтра нет необходимости , существует разница .

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

Subscriber.Id является первичным ключом, поэтому он имеет уникальные значения, а пункт WHERE Id = 20 может выбрать только одну строку.

Возможный эффект только дополнительного предложения AND OwnerId = 50 в этом примере может заключаться в запрете ОБНОВЛЕНИЯ, если 50 не должно быть значением Subscriber.OwnerId в той же строке. *

Хотя это вряд ли имеет значение для производительности (первичный ключ индексируется, поиск по индексу будет возвращать одну строку в любом случае), но в большинстве случаев это не имеет особого смысла.

Вы можете проверить выполнение с помощью EXPLAIN . Подробнее в руководстве .

1 голос
/ 25 декабря 2011

Поскольку в предложении where есть PK, оба оператора обновят одну и ту же строку.Вы только выиграете от дополнительных мер предосторожности, если другое задание может изменить строку между вашим оператором SELECT, который выполнил поиск по идентификатору, и вашим обновлением.Если вы никогда не изменяете OwnerId после создания подписчика, вы можете игнорировать OwnerId из оператора UPDATE.

Вы можете получить план выполнения для операторов SELECT с ключевым словом EXPLAIN (см. Документация MySQL ).Узнать, что использует ваше обновление, невозможно.Но если вы сделаете инструкцию SELECT с теми же полями и тем же предложением WHERE, вы должны получить сравнимый результат.

...