Обучение/Помощь новичкам | Вопрос по LIMIT 1
Тема закрыта by
SNEG

Нужен LIMIT 1 в конце sql запроса если 1 поле уникальное в бд , поиск будет продолжаться после первого совпадения ?
________
посл. ред. 10.04.2025 в 14:41; всего 4 раз(а); by SNEG
`email` VARCHAR(255) NOT NULL UNIQUE,
`password` CHAR(60) NOT NULL,
$user_data = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT `id`, `password` FROM `".DB_PREFIX."_users` WHERE `email` = '".esc($_GET['email'])."' AND `password` = '".esc($_GET['password'])."'"));
________
посл. ред. 10.04.2025 в 14:41; всего 4 раз(а); by SNEG

Для индексов с одним столбцом UNIQUE, когда MySQL находит первую строку, которая соответствует критериям поиска, он знает, что другие строки не могут иметь такое же значение. Поэтому он вернет результат.
Да, добавление LIMIT 1 в SQL-запрос имеет смысл даже если поле email уникальное, и вот почему:
email в БД уже объявлен как UNIQUE, значит, максимум один результат может быть возвращён.
Однако без LIMIT 1 MySQL всё равно будет сканировать данные до конца (если не использует индекс эффективно) — особенно если есть сложные условия, отсутствует подходящий индекс, или используется AND/OR.
Поэтому:
SELECT `id`, `password`
FROM `prefix_users`
WHERE `email` = 'user@example.com' AND `password` = 'secret'
LIMIT 1
Добавление LIMIT 1 даёт две вещи:
Подсказка для оптимизатора: MySQL может остановить выполнение после первого совпадения.
Повышение производительности, особенно при отсутствии хорошего индекса (в твоём случае email уже индексирован, но AND password = ... может мешать идеальному плану запроса).
Кстати: проверку пароля лучше делать через password_verify(), а не прямым сравнением в SQL — это безопаснее и гибче.
Хочешь покажу как?
email в БД уже объявлен как UNIQUE, значит, максимум один результат может быть возвращён.
Однако без LIMIT 1 MySQL всё равно будет сканировать данные до конца (если не использует индекс эффективно) — особенно если есть сложные условия, отсутствует подходящий индекс, или используется AND/OR.
Поэтому:
SELECT `id`, `password`
FROM `prefix_users`
WHERE `email` = 'user@example.com' AND `password` = 'secret'
LIMIT 1
Добавление LIMIT 1 даёт две вещи:
Подсказка для оптимизатора: MySQL может остановить выполнение после первого совпадения.
Повышение производительности, особенно при отсутствии хорошего индекса (в твоём случае email уже индексирован, но AND password = ... может мешать идеальному плану запроса).
Кстати: проверку пароля лучше делать через password_verify(), а не прямым сравнением в SQL — это безопаснее и гибче.
Хочешь покажу как?