我正在'companies'表上运行以下查询:
SELECT *
FROM companies
WHERE name ILIKE '%foo%'
AND (city ILIKE 'bar%' OR state ILIKE 'bar%')
我正在尝试使用杜松子酒索引,并且为名称,城市和州添加了个人索引:
CREATE INDEX trgm_idx_companies_name ON companies USING gin (name gin_trgm_ops);
CREATE INDEX trgm_idx_companies_city ON companies USING gin (city gin_trgm_ops);
CREATE INDEX trgm_idx_companies_state ON companies USING gin (state gin_trgm_ops);
但是,运行查询时仅使用名称索引。我怀疑答案在多列索引中,但是无论我尝试哪种变体,我都无法使它起作用。
答案 0 :(得分:2)
我的猜测是,“名称”比城市或州更具排斥性。假设您在表格中经常重复相同的城市和州,但是名称却不经常重复。
例如,如果这些是医院,那么在完全不同的城市和州的两家医院使用相同的名称“纪念医院”就不会出现问题,但是它的频率要比两家拥有这家医院的医院少得多相同的城市和州,而且一直在发生(德克萨斯州休斯顿,有一百家医院)。
结果,分析器可能意识到搜索“纪念医院”可能会返回X结果,X是一个很小的数字,仅扫描那些X结果比尝试使用索引更快。为什么用五个记录索引一个表?这种事情。
作为测试用例,请尝试以下操作:
SELECT *
FROM companies
WHERE (city ILIKE 'bar%' OR state ILIKE 'bar%')
我的猜测是,您将发现查询同时使用索引和位图。这应该使您对索引正在工作有信心-只是查询不需要它们。