MySQL Fulltext 或独特的 varchar 性能

标签 mysql performance full-text-search varchar

方法#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/

相关文章:

Mysql COUNT VS num rows 性能

java - 为什么我的 java lambda 有一个虚拟赋值比没有它快得多?

string - 坚持 Apostolico-Crochemore 算法

mysql - 最快的 SQL 全文搜索

php - 无法使用 MysqliDb 更新字段

php - 使用 limit(20) 时,它仅运行 DB 的前 20 个值

mysql - 在子查询中使用 if 来 CONCAT

java - JVM 如何从第二次开始更快地执行数学计算?

MYSQL - 限制连接

Postgresql全文搜索部分词