有关使用sql搜索关键字的最佳做法

时间:2009-08-19 12:25:15

标签: sql sql-server

我有三张桌子

[USER] --Master user table 
[KEYWORD] --Master keyword table  
[USER_KEYWORD] --[USER]-[KEYWORD] mapping table 

以下是我的db

中的结构
GO
--master user table
CREATE TABLE [USER]
(
    [USERID] INT IDENTITY,
    [NAME] VARCHAR(50)
)
GO

--master keyword table
CREATE TABLE [KEYWORD]
(
    [KEYWORDID] INT IDENTITY,
    [KEYWORD] VARCHAR(50)
)

GO
--x table user_keyword
CREATE TABLE [USER_KEYWORD]
(
    [USERID] INT ,
    [KEYWORDID] INT
)

GO
--Insert data in master user table
INSERT INTO [USER]
SELECT 'TESTUSER1'
UNION ALL
SELECT 'TESTUSER2'
UNION ALL
SELECT 'TESTUSER3'
UNION ALL
SELECT 'TESTUSER4'

GO
--Insert data in master keyword table
INSERT INTO [KEYWORD]
SELECT 'ASP'
UNION ALL
SELECT 'ASP.NET 3.5'
UNION ALL
SELECT 'C#'
UNION ALL
SELECT 'JAVA'
UNION ALL
SELECT 'ASP.NET'
UNION ALL
SELECT 'SQL'
UNION ALL
SELECT 'SQL SERVER'
UNION ALL
SELECT 'SQL SERVER 2005'
UNION ALL
SELECT 'SQL SERVER 2008'

GO

--Insert data in user keyword table

INSERT INTO [USER_KEYWORD]
SELECT 1,1
UNION ALL
SELECT 2,2
UNION ALL
SELECT 3,3
UNION ALL
SELECT 4,4
UNION ALL
SELECT 1,2
UNION ALL
SELECT 2,3
UNION ALL
SELECT 3,4
UNION ALL
SELECT 4,1
UNION ALL
SELECT 2,3
UNION ALL
SELECT 3,4
UNION ALL
SELECT 4,6
UNION ALL
SELECT 3,6
UNION ALL
SELECT 4,6
UNION ALL
SELECT 2,7
UNION ALL
SELECT 3,8
UNION ALL
SELECT 4,9

GO


CREATE PROC TEST_SEARCH_KEYWORDS
@SEARCHKEYWORD VARCHAR(50)
AS
BEGIN

    SELECT K.[KEYWORD],COUNT(UK.[KEYWORDID]) AS [KEWWORDCOUNT] FROM [KEYWORD] K 
    INNER JOIN [USER_KEYWORD] UK
    ON K.[KEYWORDID]=UK.[KEYWORDID]
    WHERE K.[KEYWORD] LIKE (@SEARCHKEYWORD+ '%')
    GROUP BY K.[KEYWORD]

END


--TEST EXAMPLES

EXEC  TEST_SEARCH_KEYWORDS 'ASP'
--0UTPUT
KEYWORD                                            KEWWORDCOUNT
-------------------------------------------------- ------------
ASP                                                2
ASP.NET 3.5                                        2


--TEST EXAMPLES

EXEC  TEST_SEARCH_KEYWORDS 'SQL'
--0UTPUT
KEYWORD                                            KEWWORDCOUNT
-------------------------------------------------- ------------
SQL                                                3
SQL SERVER                                         1
SQL SERVER 2005                                    1
SQL SERVER 2008                                    1

我有一个名为 TEST_SEARCH_KEYWORDS 的sp来根据外部提供的关键字搜索记录。目前我在sp中使用了类似的条件。我想知道,这将是很好的搜索记录从数据库使用像以后我的记录将继续增加。我不想使用全文搜索 因为我还要处理sql server 2000。

2 个答案:

答案 0 :(得分:1)

如果你继续搜索:

WHERE K.[KEYWORD] LIKE (@SEARCHKEYWORD+ '%')

然后您的查询将使用索引,并且应该在表增长时表现良好。但是,如果将其更改为:

WHERE K.[KEYWORD] LIKE ('%'+ @SEARCHKEYWORD+ '%')

然后它不会,它会进行表扫描,这将导致表的增长导致性能不佳。

答案 1 :(得分:0)

一个(存储饥饿的)解决方案是预先计算并存储数字关键字前缀以及实际关键字本身。然后根据外观标准,您可以在相关前缀列(如果存在)上进行直接相等比较,或者回退到执行“喜欢”比较。

例如,假设要限制搜索字必须包含至少3个字符。您可以创建列Prefix3Chars,Prefix4Chars,Prefix5Chars。假设用户输入搜索词“Hello”,并且您的数据库包含关键词“Hello,World”。您将选择搜索Prefix5Chars列并匹配关键字“Hello,World”。如果用户使用关键词“Hello,W”执行搜索,您将回到使用“like”进行搜索。