【问题标题】:Sqlite GLOB query not fast enoughSqlite GLOB 查询不够快
【发布时间】:2014-01-14 16:45:57
【问题描述】:
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)

但是为什么这么慢呢? :(

【问题讨论】:

  • testA_mt.a_id 上有索引吗?
  • 是的,它也被索引了

标签: performance sqlite glob


【解决方案1】:

数据库估计使用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"

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 2011-05-03
    • 1970-01-01
    • 2013-08-07
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2011-10-14
    相关资源
    最近更新 更多