【问题标题】:How to search for a full name when first name and last name are stored in a different columns当名字和姓氏存储在不同的列中时如何搜索全名
【发布时间】:2013-11-11 23:51:40
【问题描述】:

如果我的名字存储在名为“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')

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

谢谢

【问题讨论】:

  • 有这么多记录,确保名字和姓氏列都被索引。
  • @Satya 我已经添加了我在我的问题中尝试过的查询。速度很慢。
  • @musical_coder 我需要知道一个查询,这样我才能使用索引。请注意,我的查询没有使用索引,因为我使用了 CONCAT_WS 函数
  • 当一个人的名字是 John 和 LAstname 和 be Smith 时,为什么要使用 '%John Smith%'
  • 因为我不知道哪个是名字,哪个是姓氏。

标签: mysql


【解决方案1】:

尝试独立搜索每个字段:

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

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

ALTER TABLE `some_table` ADD key (`last_name`, `first_name`);

【讨论】:

    【解决方案2】:

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

    WHERE MATCH(first_name, last_name) AGAINST ('John Smith')
    

    【讨论】:

    • 我确实试过了,但这不是最快的。我正在尝试看看是否有更好的方法来解决这个问题。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      相关资源
      最近更新 更多