SELECT a.id, am.value FROM testA a
JOIN testA_mt am ON am.a_id = a.id
WHERE a.grp = 2 AND a.path GLOB 'foo/bar/*' AND am.key = "keyword"
testA_mt
是一个使用密钥对模型的表。
问题是运行需要1秒钟。
根据http://www.sqlite.org/optoverview.html我的GLOB查询应该进行优化,因为它符合所有要求的标准。 grp,path和key列已建立索引,我最后使用*
。
EXPLAIN QUERY PLAN看起来不错:
0
0
0
0
1
1
SEARCH TABLE testA_mt AS am USING INDEX am_key (key=?) (~10 rows)
SEARCH TABLE testA_mt AS am USING INDEX am_key (key=?) (~10 rows)
0
0
1
1
0
0
SEARCH TABLE testA AS a USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
SEARCH TABLE testA AS a USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
但为什么这么慢? :(
答案 0 :(得分:0)
数据库估计使用am_key
上的索引比使用path
上的索引更有效,因为前者会搜索确切的值。
尝试运行ANALYZE,以便数据库更好地估计索引的选择性。
如果您想强制加入订单,请使用CROSS JOIN:
SELECT a.id,
am.value
FROM testA a
CROSS JOIN testA_mt am ON am.a_id = a.id
WHERE a.grp = 2
AND a.path GLOB 'foo/bar/*'
AND am.key = "keyword"