#mysql #performance #indexing
#mysql #Производительность #индексирование
Вопрос:
У меня есть два SELECT
вопроса:
SELECT *
FROM `users_emails`
WHERE `user_id` = :id;
SELECT *
FROM `users_emails`
WHERE `user_id` = :id
AND `email` = :email;
Нужно ли мне 2 индекса?
Один за (user_id)
и один за (user_id, email)
, или (user_id, email)
будет достаточно только одного за?
структура таблицы такова:
CREATE TABLE `users_emails` (
`id` INT UNSIGNED NOT NULL,
`user_id` INT UNSIGNED NOT NULL,
`email` VARCHAR(254) NOT NULL,
PRIMARY KEY (`id`));
Комментарии:
1.
(user_id, email)
должно быть достаточно, чтобы покрыть оба запроса.2. Итак, первый запрос может содержать список из нескольких строк, если у пользователя несколько электронных писем? Вроде
users
бы получилось быuser_id
как тоPRIMARY KEY
?? Пожалуйста, предоставьтеSHOW CREATE TABLE users
3. @RickJames имя таблицы
users_emails
, извините за вводящее в заблуждение..
Ответ №1:
PRIMARY KEY
UNIQUE
ключ — это an INDEX
. Таким образом, переиндексировать PK излишне.
Если у пользователя может быть несколько электронных писем, то эта таблица представляет собой сопоставление «многие ко многим» между пользователями и электронными письмами, и вам нужно
CREATE TABLE users_emails (
user_id ...,
email ...,
PRIMARY KEY(user_id, email),
INDEX(email, user_id) -- in case you need to look up a user given an email
);
Это действительно общий случай — у пользователя может быть рабочий и личный адрес электронной почты. И / или муж и жена могут обмениваться одним электронным письмом.
Но… Если ваше приложение запрашивает у пользователя его электронную почту, он отправит вам одно электронное письмо, и вам не нужно будет знать о каких-либо других? В этом случае просто включите email
в Users
таблицу и не используйте таблицу сопоставления many:many или Emails
таблицу an.
Комментарии:
1. спасибо, так в каком случае мне нужно 2 или более индексов для одного и того же столбца? если он есть?
2. @MatanCohen — По сути, никогда не нужны 2 индекса для одного столбца. Обратите внимание, что в моем примере были те же два столбца, но расположенные по-разному — это полезно.
Ответ №2:
Если user_id является первичным ключом (или, по крайней мере, уникальным), вам просто нужно указать его в вашем запросе. Выполнение запроса как с идентификатором, так и с электронной почтой не является неправильным, это просто перебор, но может быть полезно, если один из них предоставлен userend .
Комментарии:
1. Что делать, если у пользователя несколько адресов электронной почты?
2. Насколько я понимаю из вопроса, у одного пользователя есть одно электронное письмо. Если у пользователя может быть несколько адресов электронной почты (почему, кстати?), Вы должны выполнить свой запрос через свою таблицу электронной почты или со столбцом «email2» или с a
LIKE
, если в одном столбце находится несколько электронных писем3. Вы правы, я просто предположил, что пользователь таблицы — это что-то вроде «id, имя пользователя, адрес электронной почты, пароль», и в большинстве случаев «email» — это единственное и уникальное поле таблицы
4. @herkil — Ваш комментарий не согласуется с вашим вопросом — есть ли
user_id
столбец? Илиid
столбец? Что такоеPRIMARY KEY
? И теперь вы подразумеваете, что у вас есть либоUNIQUE(email)
илиPRIMARY KEY(email)
??5. Я не могу знать структуру таблицы на основе ответа, потому что нет такой детали. @Nick предположил, что в таблице может быть 1 или более адресов электронной почты, но я не знаю, как с этим справиться. Кроме того, как я уже сказал, если есть одно электронное письмо, это, скорее всего, будет уникальное (необязательно основное) поле в таблице.