情况:
我正在尝试使用“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.GENERATOR
,EVENTSGENERAL.DATETIME
,EVENTSINFOTYPES.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数据库。
提前致谢。
答案 0 :(得分:7)
不,不幸的是,因为您在%
关键字的两边都使用了通配符(LIKE
)。前导(开始)通配符表示不能使用任何索引来帮助提高搜索速度,因此必须检查每一行以查看它是否符合条件。
您可以通过更改为LIKE 'VALUE%'
来加快速度;索引至少可以用于将搜索的行限制为以VALUE
开头的行。
答案 1 :(得分:3)
全文搜索(使用%VALUE%
)很慢,因为没有有效的方法可以做到这一点。这就像抓取一本字典来列出包含字母Q的所有单词。这需要永远。另一方面,如果你只是寻找VALUE%
,那就更容易了(如果搜索字段被索引)。这就像制作以字母Q开头的所有单词的列表。如果单词按字母顺序排序(就像它们在字典中一样),这很容易。你可以很容易地找到第一个和最后一个单词,你可以确定你需要介于两者之间的所有东西。
某些数据库允许全文搜索,它们可以索引列中的每个单词,但只能索引完整单词。因此,搜索%q%
仍然会很慢,搜索q%
会更快。我不确定Firebird是否支持它。