我有一个包含超过500万用户的表,现在有三列索引。
我正在使用电子邮件或手机更新特定列,当我这样做有时我必须更新100k用户,所以检查电子邮件或电话需要一段时间先检查然后获取ID和根据ID更新。
如果我将电子邮件和电话编入索引(两者都应该有重复的值),我的查询会比现在执行得更好吗?是否最好将电子邮件和手机编入索引,因为它们在数据库中保存为字符串。
答案 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 ...
无效,因为email
和phone
不是唯一的。
当有两行包含匹配的电子邮件时,业务逻辑是什么?你更新两个?电子邮件匹配怎么样,但电话不匹配?
如果你需要两个匹配,那么这一对是最佳的:
UNIQUE(email, phone)
INSERT ...
ON DUPLICATE KEY UPDATE ...