2

如果我的名字存储在名为“first_name”的列中并且姓氏存储在名为“last_name”的列中,我如何搜索一个人的全名

请注意,该表有几百万条记录,因此我需要一种有效的方法来进行搜索。我正在使用 MySQL 服务器

first_name 列和 last_name 列都是 VARCHAR(80) 类型。

到目前为止,我已经尝试了以下方法,但速度很慢,因为它忽略了索引,因为 concat 函数

SELECT first_name, phone FROM people
WHERE CONCAT_WS(' ',first_name, last_name) like '%John Smith%'

我还尝试在(first_name,last_name)上添加索引全文索引,然后添加此查询

SELECT *
FROM people
WHERE MATCH(first_name, last_name) AGAINST('John Smith')

但这不是最快的查询。有没有更好的方法来解决这个问题?

谢谢

4

3 回答 3

3

尝试独立搜索每个字段:

WHERE first_name = 'James' and last_name = 'Hetfield';

我还将为两者添加一个复合索引,首先使用姓氏,因为它具有更高的基数(更多唯一的行),这意味着搜索姓氏“Hetfield”应该比搜索名字“James”更快'。

ALTER TABLE `some_table` ADD key (`last_name`, `first_name`);
于 2013-11-12T00:09:32.773 回答
2

我会创建一个FULLTEXT索引(first_name, last_name)并使用MATCH()

WHERE MATCH(first_name, last_name) AGAINST ('John Smith')
于 2013-11-11T23:54:28.943 回答
1

实际上,如果你想搜索性能,你应该改变你的方法(数百万和更多的记录需要更有效的解决方案)。您能否对部分列使用 NoSQL 或全文搜索解决方案。

于 2013-11-12T00:12:51.550 回答