如何优化 Couchbase NQ1L ORDER BY
How to optimize Couchbase NQ1L ORDER BY
考虑以下用例:
索引
CREATE INDEX `type-index`ON bucket( type, createdAt) WHERE type='someType';
一个查询(性能很好)
SELECT a.*
FROM `bucket` a
WHERE a.tyoe='someType'
LIMIT 10 OFFSET 10
执行:14.51 毫秒
一个查询(执行得非常糟糕)
SELECT a.*
FROM `bucket` a
WHERE a.tyoe='someType'
ORDER BY a.createdAt DESC
LIMIT 10 OFFSET 10
执行:1m
这是一个EXPLAIN
[
{
"plan": {
"#operator": "Sequence",
"~children": [
{
"#operator": "Sequence",
"~children": [
{
"#operator": "IndexScan",
"index": "type-index",
"index_id": "ee6b75813c26795c",
"keyspace": "bucket",
"namespace": "default",
"spans": [
{
"Range": {
"High": [
"successor(\"someType\")"
],
"Inclusion": 1,
"Low": [
"\"someType\""
]
}
}
],
"using": "gsi"
},
{
"#operator": "Parallel",
"~child": {
"#operator": "Sequence",
"~children": [
{
"#operator": "Fetch",
"as": "a",
"keyspace": "bucket",
"namespace": "default"
},
{
"#operator": "Filter",
"condition": "((`a`.`_type`) = \"someType\")"
},
{
"#operator": "InitialProject",
"result_terms": [
{
"expr": "`a`",
"star": true
}
]
}
]
}
}
]
},
{
"#operator": "Order",
"limit": "10",
"offset": "10",
"sort_terms": [
{
"desc": true,
"expr": "(`a`.`createdAt`)"
}
]
},
{
"#operator": "Offset",
"expr": "10"
},
{
"#operator": "Limit",
"expr": "10"
},
{
"#operator": "FinalProject"
}
]
},
"text": "SELECT a.* FROM `bucket` a WHERE a.type='someType' ORDER BY a.createdAt DESC IMIT 10 OFFSET 10"
}
]
存储桶包含 170 万个文档。有什么方法可以提高 ORDER BY 的性能吗?值createdAt
是一个unix时间戳(数字)
解决方案是像这样创建一个索引:
CREATE INDEX `type-index` ON bucket ( -createdAt ) WHERE type='sometType';
和查询
SELECT a.*
FROM `bucket` a
WHERE type='someType'
AND -createdAt IS NOT NULL
ORDER BY -createdAt
LIMIT 10 OFFSET 10;
考虑以下用例:
索引
CREATE INDEX `type-index`ON bucket( type, createdAt) WHERE type='someType';
一个查询(性能很好)
SELECT a.*
FROM `bucket` a
WHERE a.tyoe='someType'
LIMIT 10 OFFSET 10
执行:14.51 毫秒
一个查询(执行得非常糟糕)
SELECT a.*
FROM `bucket` a
WHERE a.tyoe='someType'
ORDER BY a.createdAt DESC
LIMIT 10 OFFSET 10
执行:1m
这是一个EXPLAIN
[
{
"plan": {
"#operator": "Sequence",
"~children": [
{
"#operator": "Sequence",
"~children": [
{
"#operator": "IndexScan",
"index": "type-index",
"index_id": "ee6b75813c26795c",
"keyspace": "bucket",
"namespace": "default",
"spans": [
{
"Range": {
"High": [
"successor(\"someType\")"
],
"Inclusion": 1,
"Low": [
"\"someType\""
]
}
}
],
"using": "gsi"
},
{
"#operator": "Parallel",
"~child": {
"#operator": "Sequence",
"~children": [
{
"#operator": "Fetch",
"as": "a",
"keyspace": "bucket",
"namespace": "default"
},
{
"#operator": "Filter",
"condition": "((`a`.`_type`) = \"someType\")"
},
{
"#operator": "InitialProject",
"result_terms": [
{
"expr": "`a`",
"star": true
}
]
}
]
}
}
]
},
{
"#operator": "Order",
"limit": "10",
"offset": "10",
"sort_terms": [
{
"desc": true,
"expr": "(`a`.`createdAt`)"
}
]
},
{
"#operator": "Offset",
"expr": "10"
},
{
"#operator": "Limit",
"expr": "10"
},
{
"#operator": "FinalProject"
}
]
},
"text": "SELECT a.* FROM `bucket` a WHERE a.type='someType' ORDER BY a.createdAt DESC IMIT 10 OFFSET 10"
}
]
存储桶包含 170 万个文档。有什么方法可以提高 ORDER BY 的性能吗?值createdAt
是一个unix时间戳(数字)
解决方案是像这样创建一个索引:
CREATE INDEX `type-index` ON bucket ( -createdAt ) WHERE type='sometType';
和查询
SELECT a.*
FROM `bucket` a
WHERE type='someType'
AND -createdAt IS NOT NULL
ORDER BY -createdAt
LIMIT 10 OFFSET 10;