нужно ли мне использовать 2 индекса для одного и того же столбца или достаточно одного?

#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 или более адресов электронной почты, но я не знаю, как с этим справиться. Кроме того, как я уже сказал, если есть одно электронное письмо, это, скорее всего, будет уникальное (необязательно основное) поле в таблице.