【问题标题】:Indexing email,phone column in a table in mysql在mysql中的表中索引电子邮件,电话列
【发布时间】:2017-09-14 06:09:17
【问题描述】:

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

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

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

【问题讨论】:

标签: mysql database indexing varchar


【解决方案1】:
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 不是唯一的。

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

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

UNIQUE(email, phone)

INSERT ...
    ON DUPLICATE KEY UPDATE ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2019-07-25
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多