Sqlite GLOB查询不够快

时间:2014-01-14 16:45:57

标签: performance sqlite glob

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)

但为什么这么慢? :(

1 个答案:

答案 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"