Действие зависит от наличия индекса и типа индекса.
Если 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 ( ...)
, что также безопасно для репликации.