sql - 包含 "condition"的 ORDER BY 的索引

标签 sql performance postgresql indexing

我有一个 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/

相关文章:

sql - 在oracle中生成一个字母序列

sql - 减去不同表的两列

java - 想从数据库中检索 java 中 xml 标记的值

sql - 将数字转换为日期sql oracle

php - 如何解决执行查询时的数据库锁定问题

performance - Apache Drill 对 SQL Server 的性能不佳

ruby-on-rails - heroku run rake db :migrate fails, 未找到 gem pg; gem install pg 重复

postgresql - 将本地 postgresql 转储导入 heroku 的最安全方法是什么?

SQL子选择如果存在

java - Go 和 Java 之间的 IO 性能