索引电子邮件,mysql表中的电话列

时间:2017-09-14 06:09:17

标签: mysql database indexing varchar

我有一个包含超过500万用户的表,现在有三列索引。

我正在使用电子邮件或手机更新特定列,当我这样做有时我必须更新100k用户,所以检查电子邮件或电话需要一段时间先检查然后获取ID和根据ID更新。

如果我将电子邮件和电话编入索引(两者都应该有重复的值),我的查询会比现在执行得更好吗?是否最好将电子邮件和手机编入索引,因为它们在数据库中保存为字符串

1 个答案:

答案 0 :(得分:0)

CREATE TABLE foo (
    ...
    PRIMARY KEY(id),
    INDEX(email),
    INDEX(phone)
)

如果该提示不够,请提供您当前的CREATE TABLE以及您对SQL的“检查”和“更新”的尝试。

如果问题是关于两个列的测试,请参阅以下提示:

SELECT ...
    WHERE email = '...'
       OR phone = '...'

会很慢。一般来说,OR不能很好地优化。

这会更快:

( SELECT id
    WHERE email = '...' )
UNION DISTINCT
( SELECT id
    WHERE phone = '...' )

INSERT ... ON DUPLICATE KEY UPDATE ...无效,因为emailphone不是唯一的。

当有两行包含匹配的电子邮件时,业务逻辑是什么?你更新两个?电子邮件匹配怎么样,但电话不匹配?

如果你需要两个匹配,那么这一对是最佳的:

UNIQUE(email, phone)

INSERT ...
    ON DUPLICATE KEY UPDATE ...