gpt4 book ai didi

SQLite 索引

转载 作者:行者123 更新时间:2023-12-03 19:43:34 33 4
gpt4 key购买 nike

我无法决定索引。
就像我有下面的查询需要太多时间来执行:

select count(rn.NODE_ID) as Count,
rnl.[ISO_COUNTRY_CODE] as Country,
rnl.[FUNCTIONAL_CLASS] as Functional_Class
from RDF_NODE as rn,
RDF_LINK as rl,
RDF_NAV_LINK as rnl
where rl.[LINK_ID] = rnl.[LINK_ID]
AND rn.NODE_ID IN (rl.[NONREF_NODE_ID], rl.[REF_NODE_ID])
GROUP BY rnl.[ISO_COUNTRY_CODE],
rnl.[FUNCTIONAL_CLASS]

当我使用解释查询计划时:

0 0 0 SCAN TABLE RDF_NODE AS rn 使用覆盖 inode (~1000000 行)
0 1 2 SCAN TABLE RDF_NAV_LINK AS rnl(~6645278 行)
0 2 1 搜索表 RDF_LINK AS rl 使用索引 sqlite_autoindex_RDF_LINK_1 (LINK_ID=?) (~1 行)
0 0 0 执行列表子查询 1
0 0 0 使用 TEMP B-TREE 进行分组

所有具有索引的表。

扫描和搜索有什么区别?
我们可以更改订单吗?

最佳答案

SCAN 遍历表中的所有行(按照它们在表中存储的顺序,通常根本没有顺序),而 SEARCH 从表中查找单个行。

SQLite 将所有连接实现为嵌套循环连接。
最外面的表总是通过 SCAN 访问(除非有 WHERE 子句限制要返回的行)。
应使用 SEARCH 访问所有剩余的表以查找匹配记录;另一个 SCAN 表示没有可以用来加快查找速度的索引,因此查找每个匹配项需要搜索整个表。

对于这个特定的查询,一个很大的减速是用于实现 GROUP BY 的临时表。
如果所有分组列都在一个索引中,则不需要这样做:

CREATE INDEX UseABetterIndexNameHere
ON RDF_NAV_LINK(ISO_COUNTRY_CODE, FUNCTIONAL_CLASS);

( RDF_NAV_LINKRDF_LINK 之间的连接要求 RDF_LINK 行由它们的 LINK_ID 查找,因此该列需要一个索引。
同样, RDF_NODE需要 NODE_ID 上的索引.但这些索引已经存在。)

关于SQLite 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25619288/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com