【问题标题】:Couchbase N1QL SELECT query using ORDER BY is very slow使用 ORDER BY 的 Couchbase N1QL SELECT 查询非常慢
【发布时间】:2017-03-29 16:17:50
【问题描述】:

下面的查询很慢:

select meta(d).id, timestamp_utc, d.headline, d.text from data_01 d where type="news" and topic="some_news" and timestamp_utc is not null order by timestamp_utc asc limit 1;

我创建了以下索引/索引:

 CREATE INDEX `idx_timestamp_utc` ON `data_01`((-str_to_millis(`timestamp_utc`)))
 CREATE INDEX `idx_timestamp_utc_some_news` ON `data_01`(`timestamp_utc`) WHERE ((`type` = "news") and (`topic` = "some_news"))
 CREATE INDEX `idx_topic_and_timestamp_utc` ON `data_01`(`topic`,(-str_to_millis(`timestamp_utc`)))
 CREATE INDEX `idx_type_news_topic_some_news_timestamp_utc` ON `data_01`((-`timestamp_utc`)) WHERE ((`type` = "news") and (`topic` = "some_news"))
  • 这些都没有比 1 分钟更好的表现。
  • 桶中有 300 万个文档 topic="some_news" 有 300k 文档。
  • type="news" 有大约 200 万个文档。
  • 字段 timestamp_utc 具有以下格式:“2017-01-01T00:00:00+00:00”。
  • 字段标题的平均长度约为 100 个字符。
  • 字段文本的平均长度约为 2000 个字符。

我发现了类似的问题,但给定的修复和建议都不起作用。

感谢您回复解决此问题!

我正在运行 Couchbase 4.5.1 企业版(build-2844)

【问题讨论】:

    标签: indexing couchbase n1ql nosql


    【解决方案1】:

    在 CB 4.5.0 及更高版本中尝试以下索引之一并在下面修改查询。 该索引可用于任何主题 主题上的查询谓词是相等改变顺序以包含主题不会改变结果并且匹配查询顺序与索引键顺序相同并且查询将避免排序。

    CREATE INDEX `idx_some_news_timestamp_utc` ON `data_01`(`topic`,`timestamp_utc`) WHERE type = "news";
    CREATE INDEX `idx_some_news_timestamp_utc_headline_text` ON `data_01`(`topic`,`timestamp_utc`,headline, text) WHERE type = "news";
    
    SELECT meta(d).id, d.timestamp_utc, d.headline, d.text FROM data_01 d
    WHERE type="news" AND topic="some_news" AND timestamp_utc IS NOT NULL
    ORDER BY topic, timestamp_utc ASC LIMIT 1;
    

    【讨论】:

    • 谢谢!它确实适用于第一个索引。创建第二个索引花费的时间太长,并且对于在 100 毫秒以下的排序工作显然没有必要。 你能告诉我 DESC 排序的索引应该是什么样子,因为只有 ASC 可以快速给出结果 -> 谢谢!
    • 如果属性是数字或时间戳,您可以创建功能索引。
    • 在 5.0.0 中可以使用 DESC 选项创建索引。 Pre-5.0.0 如果属性是数字或时间戳,您可以创建功能索引。创建索引idx_some_news_timestamp_utc ON data_01(topic,-STR_TO_MILLIS(timestamp_utc)) WHERE type = "news"; SELECT meta(d).id, d.timestamp_utc, d.headline, d.text FROM data_01 d WHERE type="news" AND topic="some_news" AND -STR_TO_MILLIS(timestamp_utc) 不是 NULL ORDER BY topic, -STR_TO_MILLIS( timestamp_utc) LIMIT 1;
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多