#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
вы также должны использовать aORDER BY
в столбце, который имеет первичный или уникальный ключ, или вы знаете, что он имеет уникальные значения, иначе результаты будут недетерминированными (случайными)
Ответ №1:
Автоматически ли MySQL прекращает поиск, когда находит одно сообщение с id = 1234?
Поскольку id
это первичный ключ, у него есть индекс. MySQL использует этот индекс для поиска строки для обновления. Это не поиск в смысле просмотра многих строк. Он просто случайным образом обращается к таблице в правой строке. Поскольку это первичный ключ, MySQL знает, что он должен обновлять только одну строку. Как мы говорим в Бостоне, штат Массачусетс, США, это ужасно быстро.
Есть ли какой-либо смысл использовать LIMIT в запросе, подобном этому?
Нет.
Не пытайтесь перехитрить SQL. Это декларативный язык, а не процедурный. Используйте свои запросы, подобные вашим UPDATE
, чтобы описать, что вы хотите. MySQL имеет буквально тысячи программистских лет в коде, который он использует, чтобы определить самую быструю процедуру для использования.