Join sqlite联接的性能问题
当我遇到一个问题时,我一直在构建一个数据库结构。我有3个表A、B、C。表B和C具有1-1关系,而表A和B具有多-1关系。我试图运行以下查询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条记录。然后我记得索引存在,所以我在所有连接条件上创建了一个索引。我为
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条记录
左外部联接性能的内容
根据要求,以下是解释查询计划的输出: 对于两个内部联接:
这些索引应该足够了(而
A.B_id
上的索引是多余的)。这些查询的输出是什么?谢谢您的命令。我以前从未见过这种情况。我在语句中添加了运行解释查询计划的输出。外部连接似乎导致了整个表扫描而不是搜索。请显示表定义。我觉得自己像个十足的白痴。感谢您的帮助。C.B_id列的类型是TEXT
,而不是INTEGER
。我真不敢相信我错过了。为什么这会影响左外部联接
而不是内部联接
,这仍然令人震惊。使用SQLLite执行多个内部联接是一个非常糟糕的主意,因为此DB系统显然不适合这样做。我用MariaDB在一个大表上尝试了一个包含10个内部联接的查询,它只花了不到一秒钟的时间,而在sqllite中它只持续了大约3分钟。在Google上搜索“sql lite内部连接速度”,您将看到问题:/