Автоматически ли MySQL ограничивает затронутые строки, когда уникальный ключ используется в качестве условия запроса?

#mysql

#mysql

Вопрос:

Давайте посмотрим на этот SQL-запрос к базе данных MySQL:

 UPDATE `messages` SET `read`=1 WHERE `id`=1234;
  

Давайте предположим, что messages это действительно длинная таблица id , которая автоматически увеличивается и является первичным ключом.

Мой вопрос:

Автоматически ли MySQL прекращает поиск, когда находит одно сообщение с id=1234 ? Или, другими словами: есть ли смысл использовать LIMIT в запросе, подобном этому?

Комментарии:

1. Он вообще не выполняет «поиск». Он использует индекс первичного ключа, чтобы найти эту конкретную запись и обновить ее. Вы замечаете какое-то другое поведение? Что работает не так, как ожидалось?

2. извините, я не очень хорошо знаком с тем, как работают движки баз данных. Я предполагал, что для такого запроса механизм db перебирает все строки таблицы и проверяет, выполнены ли все условия, указанные в запросе; так, например, если механизм db найдет соответствие для этого запроса в первой строке, он все равно проверит все остальные строки в таблице, верно? Работает ли это по-другому для первичных ключей?

3. MySQL 5.6 поддерживает ОБЪЯСНЕНИЕ UPDATE .. Один из способов проверить, как MySQL обрабатывает UPDATE запросы.. Полное объяснение того, как работает механизм базы данных, очень широкое..

4. @Lis: это был бы очень неэффективный дизайн для базы данных. Похоже, ваш вопрос основан на ложной предпосылке и на самом деле не имеет смысла. Если вам интересно узнать, как работают реляционные базы данных, есть тома литературы и исследований по этому вопросу. MySQL также имеет открытый исходный код: github.com/mysql/mysql-server

5.НЕТ «MySQL автоматически прекращает поиск, когда находит одно сообщение с id = 1234? Или, другими словами: есть ли смысл использовать LIMIT в запросе, подобном этому? «здесь нет смысла использовать LIMIT ..Также, вообще говоря, при использовании LIMIT вы также должны использовать a ORDER BY в столбце, который имеет первичный или уникальный ключ, или вы знаете, что он имеет уникальные значения, иначе результаты будут недетерминированными (случайными)

Ответ №1:

Автоматически ли MySQL прекращает поиск, когда находит одно сообщение с id = 1234?

Поскольку id это первичный ключ, у него есть индекс. MySQL использует этот индекс для поиска строки для обновления. Это не поиск в смысле просмотра многих строк. Он просто случайным образом обращается к таблице в правой строке. Поскольку это первичный ключ, MySQL знает, что он должен обновлять только одну строку. Как мы говорим в Бостоне, штат Массачусетс, США, это ужасно быстро.

Есть ли какой-либо смысл использовать LIMIT в запросе, подобном этому?

Нет.

Не пытайтесь перехитрить SQL. Это декларативный язык, а не процедурный. Используйте свои запросы, подобные вашим UPDATE , чтобы описать, что вы хотите. MySQL имеет буквально тысячи программистских лет в коде, который он использует, чтобы определить самую быструю процедуру для использования.