2011-12-25 2 views
1

У меня есть две MySQL таблицы, как это:SQL ПК Lookup с дополнительной колонкой

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

В то время как это не необходимо, чтобы добавить дополнительный фильтр, есть разница.

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

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

только возможный эффект дополнительного пункта AND OwnerId = 50 в этом примере может быть, чтобы запретить UPDATE, если 50 не должно быть значение Subscriber.OwnerId в той же строке.

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

Вы можете проверить выполнение с помощью EXPLAIN. More info in the manual.

+0

Я понимаю результаты запроса. Меня интересует только производительность. – Harper

+0

@ Харпер: Я все еще был в этом. Последняя часть касается плана выполнения и выполнения. –

+0

Brandstetter: Спасибо. – Harper

1

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

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

Смежные вопросы