Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Join sqlite联接的性能问题_Join_Sqlite_Database Performance - Fatal编程技术网

Join sqlite联接的性能问题

Join sqlite联接的性能问题,join,sqlite,database-performance,Join,Sqlite,Database Performance,当我遇到一个问题时,我一直在构建一个数据库结构。我有3个表A、B、C。表B和C具有1-1关系,而表A和B具有多-1关系。我试图运行以下查询 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条记录。然后我记得索引存在,所以我在所有连接条件上创建了一个索引。我为

当我遇到一个问题时,我一直在构建一个数据库结构。我有3个表A、B、C。表B和C具有1-1关系,而表A和B具有多-1关系。我试图运行以下查询

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创建了一个。结果是一个有效的查询。在我删除了limit子句之后,它也起了作用,所以我继续进行下一个查询

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
请注意,唯一的区别是第二个联接现在是左外部联接。我认为既然键都是一样的,索引应该仍然会加快这个键的速度。我不正确,因为上面的查询已经完成,但速度相当慢。我删除了limit子句,查询没有完成。我删除了之前添加的索引,并再次尝试使用受限语句。它同时运行

问题是没有索引,
内部连接
根本不起作用,
左侧外部连接
只在有限的情况下起作用,尽管速度也很慢。有了索引,
内部连接
以我所需要的速度成功完成,但
左侧外部连接
继续工作

  • 表A有20万条记录
  • 表B有50000条记录
  • 表C有10000条记录
  • 上面的左外部联接查询应生成40000条记录
有人知道加快速度的方法吗?我是否缺少一个索引或一些可以提高
左外部联接性能的内容


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

对于两个内部联接:

  • “0”“0”“2”“使用覆盖索引C扫描表C.bid(~1000000行)”
  • “0”“1”“1”“使用整型主键(rowid=?)搜索表B(~1行)”
  • “0”“2”“0”“使用覆盖索引A搜索表A.bid(B_id=?)(~10行)”
  • 对于内部联接和外部联接:

  • “0”“0”“0”“使用覆盖索引A扫描表A.bid(~1000000行)”
  • “0”“1”“1”“使用整型主键(rowid=?)搜索表B(~1行)”
  • “0”“2”“2”“使用覆盖索引C扫描表C.bid(~100000行)”

  • 这些索引应该足够了(而
    A.B_id
    上的索引是多余的)。这些查询的输出是什么?谢谢您的命令。我以前从未见过这种情况。我在语句中添加了运行解释查询计划的输出。外部连接似乎导致了整个表扫描而不是搜索。请显示表定义。我觉得自己像个十足的白痴。感谢您的帮助。C.B_id列的类型是
    TEXT
    ,而不是
    INTEGER
    。我真不敢相信我错过了。为什么这会影响
    左外部联接
    而不是
    内部联接
    ,这仍然令人震惊。使用SQLLite执行多个内部联接是一个非常糟糕的主意,因为此DB系统显然不适合这样做。我用MariaDB在一个大表上尝试了一个包含10个内部联接的查询,它只花了不到一秒钟的时间,而在sqllite中它只持续了大约3分钟。在Google上搜索“sql lite内部连接速度”,您将看到问题:/