3

我的用户表有一个“名称”列,其中包含如下信息:

Joe Lee
Angela White

我想有效地搜索名字或姓氏。名字很简单,我可以

SELECT * FROM user WHERE name LIKE "ABC%"

但是对于姓氏,如果我这样做

SELECT * FROM user WHERE name LIKE "%ABC"

那将是非常缓慢的。

所以我正在考虑计算输入的字符,例如“ABC”有 3 个字符,如果我只能搜索名称列中的最后三个字符,那就太好了。所以我想要类似的东西

SELECT * FROM user WHERE substring(name, end-3, end) LIKE "ABC%"

MySQL中有什么可以做到这一点吗?

非常感谢!

PS。我不能做全文,因为我们的搜索引擎不支持。

4

4 回答 4

4

原因是

  WHERE name LIKE '%ith' 

按姓氏查找“约翰·史密斯”是一种缓慢的方法。

  WHERE Right(name, InStr(name, ' ' )) LIKE 'smi%'

或列上的任何其他表达式都很慢。它破坏了使用索引进行快速查找,并使 MySQL 服务器进行全表扫描或全索引扫描。

如果您使用的是 Oracle(也就是说,如果您为以前富有的雇主工作),您可以使用函数索引。因为它是你必须添加一些额外的列或一些其他帮助数据来加速你的搜索。

你最聪明的做法是将你的名字和姓氏分成不同的列。其他几个人已经指出了这样做的充分理由。

如果你不能这样做,你可以尝试创建一个包含反向名称字符串的额外列,并在该列上创建一个索引。例如,该列将存储为“htimS nhoJ”的“John Smith”。然后你可以搜索如下。

 WHERE nameReversed LIKE CONCAT(REVERSE('ith'),'%')

此搜索将使用索引并且速度相当快。我已经取得了很好的成功。

于 2012-06-13T20:51:36.570 回答
0

你很近。在 MySQL 中,您应该能够使用InStr(str, substr)Right(str, index)执行以下操作:

 SELECT * FROM user WHERE Right(name, InStr(name, " ")) LIKE "ABC%"

InStr(name, " ")返回空格字符的索引(您可能必须使用" "语法)。然后在Right()函数中使用该索引仅搜索姓氏(基本上;当您有多个名称、多个空格等时会出现问题)。LIKE "ABC%"然后将搜索以 ABC 开头的姓氏。

您不能使用固定索引,因为长度超过 3 个或少于 3 个字符的名称不会按照您的建议正确返回。

但是,正如 Zane 所说,使用单独的字段是一种更好的做法。

于 2012-06-13T19:43:51.000 回答
0

如果它是一个 MyIsam 表,您可以使用自由文本搜索来做同样的事情。

于 2012-06-13T19:47:20.050 回答
-1

您可以使用 REGEXP 运算符:

SELECT * FROM user WHERE name REGEXP "ABC$"

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

于 2012-06-13T19:44:42.323 回答