мне нужно использовать 2 индекса для одного столбца или один достаточно? - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть два 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`));

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

PRIMARY KEY - это UNIQUE ключ - 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.

0 голосов
/ 14 апреля 2019

Если user_id является первичным ключом (или, по крайней мере, уникальным), вам просто нужно указать его в своем запросе.Выполнение запроса с идентификатором и адресом электронной почты не является неправильным, это просто излишне, но может быть полезно, если один из них предоставлен userend.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...