【发布时间】:2014-10-04 00:58:45
【问题描述】:
在 MySQL 中使用全文搜索时,我遇到了一个令我感到困惑的问题。我正在运行 MySQL 5.1.67。这是我的简化表:
CREATE TABLE `contact_info` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(25) DEFAULT NULL,
`last_name` varchar(35) DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `idx_ft_first_name_last_name` (`first_name`,`last_name`)
) ENGINE=MyISAM CHARSET=latin1;
我想在一个大约有 500 万行的表中查询名字和姓氏。如上表所示,名字和姓氏位于不同的列中。我想获取名字和姓氏都是“John Smith”的所有行。我不希望所有以约翰为名字或史密斯为姓氏的人。我知道我可以执行以下操作,但由于用户有时会选择将全名存储在 first_name 列或 last_name 列中,因此我正在尝试设置全文搜索。
SELECT ci.first_name,ci.last_name FROM contact_info ci
WHERE ci.first_name LIKE 'John%' AND ci.last_name LIKE 'Smith%'
当我运行查询强制它使用主键索引时,它会为 John Smith 返回几百条记录,这就是我想要的,但它很慢,大约需要 5 秒。这是查询:
SELECT ci.first_name,ci.last_name FROM contact_info ci USE INDEX(PRIMARY)
WHERE MATCH(ci.first_name,ci.last_name) AGAINST ('"John Smith"' IN BOOLEAN MODE);
当我使用优化器首选的索引运行查询时,它不会返回任何内容。
SELECT ci.first_name,ci.last_name FROM contact_info ci USE INDEX(idx_ft_first_name_last_name)
WHERE MATCH(ci.first_name,ci.last_name) AGAINST ('"John Smith"' IN BOOLEAN MODE);
为什么不返回任何东西?难道不能用这样的全文索引跨两列查询“John Smith”吗?
【问题讨论】:
标签: mysql full-text-search full-text-indexing fulltext-index