繁体   English   中英

改进Firebird数据库的'%LIKE%'查询

[英]Improving '% LIKE %' Query on Firebird Database

情况:

我正在尝试使用“LIKE”语句编写一个有效的查询来将一段文本照片到一个包含短文本的列中。

模型:

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 All Ascending。

我的查询:

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数据库。

提前致谢。

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

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

全文搜索(使用%VALUE% )很慢,因为没有有效的方法可以做到这一点。 这就像抓取一本字典来列出包含字母Q的所有单词。这需要永远。 另一方面,如果你只是寻找VALUE%那么它会更容易(如果搜索字段被索引)。 这就像制作一个字母Q 开头的所有单词的列表。如果单词按字母顺序排序(就像它们在字典中一样),这很容易。 您可以轻松找到第一个和最后一个单词,并且您可以确定您需要介于两者之间的所有内容。

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

如果您有一个大型数据库并且希望能够搜索%q% ,那么您应该查看其他专业解决方案,例如LuceneXapian

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM