【问题标题】: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 ... 将不起作用,因为 email 和 phone 不是唯一的。
当有两行匹配的电子邮件时,业务逻辑是什么?你更新两个?电子邮件匹配但电话不匹配怎么办?
如果你需要 both 来匹配,那么这对是最优的:
UNIQUE(email, phone)
INSERT ...
ON DUPLICATE KEY UPDATE ...