方法#1(全文):
CREATE TABLE `addresses` (
`id` int(10) unsigned NOT NULL auto_increment,
`mail` text NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `mail` (`mail`)
);
通过搜索找出存在:
SELECT * FROM addresses WHERE MATCH(email) AGAINST('"name@example.com"' IN BOOLEAN MODE)
或方法#2(唯一的 varchar):
CREATE TABLE `addresses` (
`id` int(10) unsigned NOT NULL auto_increment,
`mail` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `mail` (`mail`)
);
找出存在与插入:
INSERT INTO `addresses` (`id`, `mail`) VALUES (NULL , 'name@example.com');
如果失败则存在:
#1062 - Duplicate entry 'name@example.com' for key 2
在数千行中查找存在的邮件地址,哪种方法更好?
最佳答案
方法 3(使用唯一的 varchar)更好:
SELECT * FROM addresses WHERE email = 'name@example.com'
全文搜索完全匹配不是一个好主意,使用插入来测试是否存在某些内容是错误的(尽管如果您打算无论如何都插入它是正确的)。
请注意,根据编码,唯一约束可能不区分大小写。如果您使用 utf-8-bin,它将对碱基敏感。
关于MySQL Fulltext 或独特的 varchar 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754734/