我有一个 2000 万行表的查询,其中包含以下内容:
ORDER BY (language_code = '%s') DESC, (language_code = '%s') DESC
%s
在运行时被替换为实际的语言代码(目的是对结果进行排序,以便用户语言的代码排在第一位,然后是默认语言的代码,最后是其他)。
我创建了以下索引:
CREATE INDEX 'index_on_language_code' ON 'my_table' (language_code)
但是现在一个查询大约需要 10 秒,考虑到没有 ORDER BY
子句它只需要几毫秒,这太长了。
对更好的索引有什么建议吗?
更新:
=> EXPLAIN for: SELECT "localized_skills".* FROM "localized_skills" ORDER BY (localized_skills.language_code = 'it') DESC, (localized_skills.language_code = 'en') DESC LIMIT 10
QUERY PLAN
Limit (cost=643126.40..643126.43 rows=10 width=42)
-> Sort (cost=643126.40..678294.56 rows=14067262 width=42)
Sort Key: (((language_code)::text = 'it'::text)), (((language_code)::text = 'en'::text))
-> Seq Scan on localized_skills (cost=0.00..339137.93 rows=14067262 width=42)
(4 rows)
更新 2
在 ORDER BY
(或等效解决方案)之前添加 WHERE language_code = 'it' OR language_code = 'en'
不会改进我的查询。事实上,我的数据,目前,已经只有 en 或 it 了。当我用其他语言在数据库中添加更多行时,这将防止时间增加,但查询不会少于 10 秒。
最佳答案
您的索引在此 ORDER BY
中不可用。如果您有固定的字符串,您可以创建功能索引,例如 language_code = 'it'
但在这种情况下,我建议您使用 WHERE language_code = 'it' OR language_code = ' 执行第一个查询en'
对查询的这一部分进行排序,然后不按顺序执行与所有其他语言的联合。你会得到相同的结果,但我认为要快得多。
关于sql - 包含 "condition"的 ORDER BY 的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29921888/