在 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”?