У меня есть 2 таблицы: пользователи и предметы. У каждого элемента есть номер пользователя. Итак, если я хочу найти только элементы, связанные с конкретным пользователем, я могу:
ВЫБРАТЬ * ИЗ элементов ГДЕ user_id = "$ user_id";
Но если есть тысячи элементов, поиск по таблице займет вечность, верно?
Есть ли лучший способ сделать это? Может быть, способ сохранить все номера элементов, связанных с пользователем, в поле в таблице пользователей?
Спасибо, Джейсон
3 ответа
Нет, это не займет вечность. Так и надо, даже если бы записей были миллионы.
Я заметил, что вы указали значение user_id ... Разве это не числовое поле? Цитаты не нужны.
Очевидно, что user_id должен быть индексированным полем.
$query = "select * from items where user_id = $user_id";
и убедитесь, что вы дезинфицируете эту переменную, чтобы она не могла быть sql-инъекцией.
Базы данных (не только MySQL) довольно быстрые при поиске. Таким образом, даже в миллионах записей потребуется всего несколько миллисекунд, чтобы найти такую строку. Базы данных используют для этого «индексы» - поэтому, если столбец «user_id» не является первичным ключом, создайте индекс для user_id. В противном случае это могло быть медленным.
Сохраните текущую структуру, но добавьте индекс на user_id
. Это будет означать, что нет необходимости искать «тысячи элементов» при поиске в этом столбце.
Сохранение нескольких значений в одном столбце (нарушение первой нормальной формы) было бы шагом назад, поскольку это резко снизило бы эффективность противоположного запроса при поиске на item_id
.
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.