我有两个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`));
答案 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
表。