2009-08-08 63 views
1

我有一个包含40万条记录的mysql表,这些记录由一个我无法控制的进程填充。数据每月只添加一次。该表格需要通过名称列进行搜索。但名称列包含格式为“Last First Middle”的全名。如何搜索列的一部分?

在sphinx.conf中,我有

sql_query = SELECT Id, OwnersName, 
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname 
FROM table1 

如何使用狮身人面像搜索按名字和/或姓氏进行搜索吗?我希望能够以第一个名字搜索“Smith”?

回答

1

从其他答案来看,我可能错过了一些东西......但要限制搜索狮身人面像到一个特定的领域,请确保您使用扩展(或extended2)匹配模式,然后使用以下查询字符串:@firstname Smith

4

SQL查询中的每行函数对于可能变大的表而言总是一个坏主意。如果你想搜索一列的一部分,它应该被提取到它自己的列并索引。

我建议,如果您对模式拥有权力(与群体流程相对),那么插入一个名为OwnersFirstName和OwnersLastName的新列以及从OwnersName中提取相关信息并推广新列的update/insert触发器适当。

这意味着计算出名字的费用只在行更改时执行,而不是每次执行您运行查询。现在是时候这样做了。

然后你的查询变得非常快。而且,是的,这打破了3NF,但是大多数人并没有意识到,如果你了解其后果,那么出于性能考虑就可以这么做。而且,由于新列由触发器控制,所以引起关注的数据重复是“干净”的。

人们在数据库中遇到的大多数问题是查询的速度。浪费一点磁盘空间来获得大量的性能改进通常是可以的。

如果您已经绝对有没有甚至可以架构模式,另一种可能性是使用“正确”模式创建自己的数据库并定期从实际数据库中填充它。然后查询你的。这可能涉及每月数据的公平传输,所以如果允许的话,第一种选择是更好的。

+0

@Pax你可以在名字和姓氏分裂后进一步阐述它吗?我是否为名字和姓氏设置单独的索引? – Shoan 2009-08-08 15:30:41

+0

如果你想单独搜索它们(听起来像你一样),那么是的 - 每一个索引。 – paxdiablo 2009-08-08 23:33:40

0

您可以使用子字符串来获取您想要搜索的字段的部分,但这会降低进程速度。查询不能使用任何种类的索引来进行比较,因此它必须触摸表中的每条记录。

最好的办法不是在同一个字段中存储多个值,而是将名称组件放在三个单独的字段中。在字段中存储多个值时,访问数据几乎总是有些问题。我在不同的论坛上一遍又一遍地看到这个...

0

这是一个棘手的问题,因为fulll名称可以包含前缀,后缀,中间名和无中间名,带连字符和不带连字符的复合姓和名。是没有合理的方式来做到这一点与100%的可靠性

+0

是的,但正如问题中提到的,该字段的格式是“Last First Middle”。 – Shoan 2009-08-08 15:39:44