索引电子邮件,mysql 中 table 中的 phone 列

Indexing email,phone column in a table in mysql

我有一个 table 拥有超过 500 万用户,现在有一个三列的索引。

我正在使用电子邮件或 phone 更新特定列,当我这样做时有时我必须更新 100k 用户,因此 检查电子邮件或 phone 正在采取while先检查然后获取id,然后根据id更新。

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

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

如果该提示还不够,请提供您当前的 CREATE TABLE 以及您在 SQL 的 'check' 和 'update' 的尝试。

如果问题是关于 两个 列的测试,这里有一些提示:

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

会很慢。总的来说OR没有优化好。

这样会更快:

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

INSERT ... ON DUPLICATE KEY UPDATE ... 将不起作用,因为 emailphone 不是唯一的。

当有两行具有匹配的电子邮件时,业务逻辑是什么?你更新两个吗?如果电子邮件匹配,但 phone 不匹配怎么办?

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

UNIQUE(email, phone)

INSERT ...
    ON DUPLICATE KEY UPDATE ...