Удалить строку из таблицы с условиями uniqueField = 1 - PullRequest
1 голос
/ 28 марта 2011
DELETE FROM table WHERE uniqueField = 1

Когда MySQL находит строку с uniqueField = 1, он удаляет ее. Затем он прекращает проверку других строк, потому что уникальное поле имеет только одну строку со значением 1?

Или MySQL продолжит поиск даже после того, как найдет строку с uniqueField = 1?

Ответы [ 2 ]

4 голосов
/ 28 марта 2011

Если uniqueField объявлено UNIQUE, создается неявный индекс для контроля уникального ограничения.

MySQL, скорее всего, будет использовать этот индекс для поиска удаляемой записи.

Так как этот индекс будет UNIQUE, механизм будет сканировать только одну запись.

Если поле не объявлено уникальным и не проиндексировано, то MySQL будет необходимо отсканировать все записи, чтобы проверить значениеэтого поля.

3 голосов
/ 28 марта 2011

Действие зависит от наличия индекса и типа индекса.

Если uniqueField является частью индекса UNIQUE, MySQL будет использовать индекс, чтобы найти соответствующую строку, которая может быть не более одной строки, и удалить ее.

Если uniqueField является частью INDEX неуникального индекса, он будет использовать этот индекс, чтобы найти подходящие строки, которые могут быть 0, 1 или более, и удалить их.

Если uniqueField не является частью какого-либо индекса, ему нужно будет сканировать всю таблицу спереди назад. Даже если он найдет одну строку, он продолжит сканирование таблицы до конца.

MySQL поддерживает расширение до DELETE с помощью LIMIT предложений: DELETE FROM sometable WHERE uniqueField = 1 LIMIT 1 и может использовать это для оптимизации запроса. Он остановится после первого удаления и не будет сканироваться до конца. Это не повторяется, так как порядок строк на ведущем и ведомом устройствах не обязательно идентичен (т. Е. Он может удалить разные строки на ведущем и ведомом устройствах, что приведет к расхождению данных.)

Вы можете использовать DELETE с LIMIT и ORDER BY, чтобы сделать эту репликацию снова безопасной, за дополнительную стоимость сортировки: DELETE FROM sometable WHERE uniqueField = 1 ORDER BY id LIMIT 1.

Или вы можете сначала SELECT id FROM sometable WHERE uniqueField = 1, а затем создать список идентификаторов и DELETE FROM sometable WHERE id IN ( ...), что также безопасно для репликации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...