sqlite连接的性能问题

时间:2014-08-27 20:15:21

标签: join sqlite database-performance

当我遇到问题时,我一直致力于构建数据库结构。我有3张桌子A,B,C。表B和C具有1-1的关系,而表A和B具有多的关系。我试图运行以下查询。

SELECT A.id
FROM A
INNER JOIN B ON A.B_id = B.id
INNER JOIN C ON B.id = C.B_id
LIMIT 0,40

查询从未完成,程序在没有响应之前运行了几秒钟。看到这个查询将需要返回数千条记录,我感到非常恼火,它的工作仅限于40条记录。然后我记得索引存在,所以我在所有连接标准上创建了一个索引。我为A.B_id,B.id和C.B_id创建了一个。结果是一个有效的查询。我删除了限制条款后也工作了,所以我继续进行下一个查询。

SELECT A.id
FROM A
INNER JOIN B ON A.B_id = B.id
LEFT OUTER JOIN C ON B.id = C.B_id
LIMIT 0,40

请注意,唯一的区别是第二个连接现在是左外连接。我虽然因为密钥都是一样的,索引仍然应该加速这个。我错了,因为上面的查询已经完成,但速度很慢。我删除了限制条款,查询没有完成。我删除了之前添加的索引,并再次尝试了有限的语句。它在同一时间运行。

问题最终是没有索引,INNER JOIN根本不起作用,而LEFT OUTER JOIN只在有限的情况下起作用,尽管它也很慢。使用索引,INNER JOIN尽快成功完成,但LEFT OUTER JOIN继续大致相同。

  • 表A有200,000条记录
  • 表B有50,000条记录
  • 表C有10,000条记录
  • 上面的LEFT OUTER JOIN查询应生成40,000条记录

有谁知道加快这个速度的方法?我错过了一个可以提高LEFT OUTER JOIN性能的索引吗?


根据要求,以下是解释查询计划的输出:

对于两个INNER JOINS:

  1. " 0" " 0" " 2" " SCAN TABLE C使用COVERING INDEX c.bid(~1000000行)"
  2. " 0" " 1" " 1" "使用INTEGER PRIMARY KEY(rowid =?)(~1行)"
  3. 搜索表B.
  4. " 0" " 2" " 0" "搜索表A使用覆盖索引a.bid(B_id =?)(~10行)"
  5. 对于INNER JOIN和OUTER JOIN:

    1. " 0" " 0" " 0" "扫描表A使用覆盖索引a.bid(~1000000行)"
    2. " 0" " 1" " 1" "使用INTEGER PRIMARY KEY(rowid =?)(~1行)"
    3. 搜索表B.
    4. " 0" " 2" " 2" " SCAN TABLE C使用COVERING INDEX c.bid(~100000行)"

0 个答案:

没有答案