HSQLDB 文本搜索性能
Posted
技术标签:
【中文标题】HSQLDB 文本搜索性能【英文标题】:HSQLDB text search performance 【发布时间】:2016-06-10 02:59:59 【问题描述】:我在运行简单搜索时表现不佳(约 20-30 秒):
select Text from Library where REGEXP_MATCHES(Text, '.*abc.*')
select Text from Library where Text LIKE '%abc%'
这是我的桌子的描述:
从库中选择计数 (*) = 1 628 062 从库中选择 AVG(LENGTH(Text)) = 766 个字符 Library.script 文件为 2.5GB 文本字段已编入索引 我已经完成了 SHUTDOWN COMPACT; 库是一个“内存”表有些事情可能不正常:
我没有此 DB 的 Library.data 或 .data 文件对于如何使这种查询更快,我已经没有什么想法了。
有什么建议吗?
【问题讨论】:
这些查询都不能使用索引(除了 Postgres 之外,几乎所有其他 DBMS 也是如此)。但是对 160 万行的完整扫描也不应该花费 30 秒。但我不认为你可以在 HSQLDB 中做任何事情来加速这些查询。 【参考方案1】:以最简单的形式编写查询。
select text from library where position('abc' in text) > 0
我检查了一下,这在 150 万行中大约需要一秒钟(但平均长度更短)。它应该比你尝试的要少。
【讨论】:
感谢 fredt,它确实比 like 和 regexp 快。但是,它不像 like 或 regexp 那样通用。当然,我们可以在子查询中使用位置作为一级过滤器,在主查询中使用正则表达式作为二级过滤器。你有别的看法吗? 除了你描述的以外没有别的办法。如果您使用 POSITION(...) > 0 AND REGXP_MATCHES(...) 它也可能有效,因为它通常按给定顺序应用过滤器。 是的,其中 POSITION('...' IN ...)>0 和 REGEXP_MATCHES(..., '.*') 提供了最佳性能,可能是最优雅的解决方案:~ 1.5秒以上是关于HSQLDB 文本搜索性能的主要内容,如果未能解决你的问题,请参考以下文章
HSQLDB 结果集 - 如何获取没有引号的 HSQLDB 返回空间作为空格且不为空?