2009-08-08 59 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