2012-01-25 45 views
3

现状:提高“%LIKE%”的Firebird数据库查询

我想写使用“喜欢”一个有效的查询语句来一段文字与短文一列之后的样子。

型号:

Table 'EVENTSGENERAL' : { ID (KEY), GENERATOR_ (FK), DATETIME, COMPUTERNAME, OSLOGIN, DBLOGIN, INFOTYPE, INFO } 

Table 'EVENTSGENERATORS' : { ID (KEY), GENERATOR_ (FK), SHORTNAME, LONGNAME } 

Table 'EVENTSINFOTYPES' : { ID (KEY), GENERATOR_ (FK), VERSION_, INFOTYPE, DESCRIPTION } 

指标:EVENTSGENERAL.GENERATOREVENTSGENERAL.DATETIMEEVENTSINFOTYPES.INFOTYPE 所有提升。

我的查询:

SELECT FIRST @first SKIP @skip A.ID,B.LONGNAME, A.DATETIME, A.COMPUTERNAME,A.OSLOGIN, A.DBLOGIN, C.DESCRIPTION, A.INFO 
FROM EVENTSGENERAL A JOIN EVENTSGENERATORS B ON B.GENERATOR_ = A.GENERATOR_ 
JOIN EVENTSINFOTYPES C ON C.GENERATOR_ = A.GENERATOR_ AND C.INFOTYPE = A.INFOTYPE 
WHERE C.DESCRIPTION LIKE '%VALUE%' 

问题:

这个查询将在超大数据库上运行。有什么办法可以改善它吗? 我正在使用Firebird数据库。

在此先感谢。

回答

7

不,不幸的是,因为您在LIKE关键字的两侧使用了通配符(%)。前导(开始)通配符意味着没有索引可用于帮助提高搜索速度,因此必须检查每一行以查看它是否符合标准。

您可以通过更改为LIKE 'VALUE%'来加快速度;一个索引至少可以用来限制搜索行到那些以VALUE开头的行。

+0

如果我使用“LIKE%”,而不是什么会改变?会更快吗? –

+0

如果您的意思是LIKE'VALUE%',那么您应该可以将VALUE编入索引以获得一些性能提升。您可以尝试创建索引,然后执行Filebird的“解释计划”。 –

+0

编辑为在查询速度中包含'LIKE'VALUE%''效果。 –

3

全文搜索(使用%VALUE%)很慢,因为没有有效的方法来做到这一点。这就像抓词典来制作一个包含包含字母Q的所有单词的列表。这需要永久。另一方面,如果你只是寻找VALUE%这很容易(如果搜索字段索引)。这就像制作一个开始于字母Q的所有单词列表。如果单词按字母顺序排序(就像它们在字典中一样),这很容易。你可以很容易找到第一个和最后一个单词,并且你可以确定你需要的是一切,而不是其他的。

有些数据库允许进行全文搜索,他们可以对列中的每个单词进行索引,但只对整个单词进行索引。因此,搜索%q%仍然会很慢,搜索q%会更快。我不确定Firebird是否支持它。

如果你有一个大的数据库,并且希望能够搜索%q%,你应该考虑其他的,专业化的解决方案,如LuceneXapian

+0

感谢您的解释,它最终索引数据库并使用'Word%'查询来加快速度。这不是我想要的,但至少现在有帮助。 第一次发布后,我可能会检查lucene,看它是否符合我的需求。 再次感谢! –

+0

我看到什么问题“El CorteInglés”如果我写“el”有没有一种方法来增加单词的资本或不 –