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