我使用视图在postgresql数据库上实现了一个简单的全文搜索。例如。就像是
create view searches as
(
select id as searchable_id, 'Person' as searchable_type,
coalesce(last_name, '') || ' ' || coalesce(first_name, '') || ' ' || coalesce(organization_name, '') || ' ' || coalesce(comments, '') as term
from people
union
select id as searchable_id, 'Community' as searchable_type,
name || ' ' || coalesce(comments, '') as term
from communities
union
select id as searchable_id, 'Street' as searchable_type,
name || ' ' || coalesce(comments, '') as term
from streets
)
这是一个简化的示例:它包含14个表的并集。
通过这种方式,我通常可以轻松查询与特定搜索词匹配的所有“记录”。尼斯。我可以很容易地计算它们,然后我向用户呈现每个“searchable_type”的nr个匹配项。
然后,用户可以选择检索特定类型,然后遇到性能问题:查询表始终对所有表执行全表扫描,即使我指定了特定的“表”(searchable_type)。
所以要说明一下:
select * from searches where searchable_type like '%something%' and searchable_type='Person'
大约需要5秒钟,如果我运行相同的查询
select * from (
select id as searchable_id, 'Person' as searchable_type,
coalesce(last_name, '') || ' ' || coalesce(first_name, '') || ' ' || coalesce(organization_name, '') || ' ' || coalesce(comments, '') as term
from people) as searches
where term like '%something%'
返回约40ms。
那我怎么解决这个问题呢?我想使用视图,但具有单个查询的性能。换句话说:如何避免重复定义查询两次? (一次在视图中,一次单独)。
提高速度的想法:
如果不是使用“searchable_type”字符串,而是使用整数,那么你的性能会提高很多。
您可以添加一个附加表以从String获取相应的整数id(例如“Person”)。