我需要在同一列中使用2个索引还是一个索引足够?

时间:2019-04-14 12:18:33

标签: mysql performance indexing

我有两个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 :(得分:0)

如果user_id是主键(或至少是唯一键),则只需在查询中指定此键。 使用ID和电子邮件进行查询并没有错,只是过大了,但是如果userend提供了其中之一可能会很有用。

答案 1 :(得分:0)

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表。