我有一些类似于以下的SQL,它连接四个表,然后通过第一个的“status”列对结果进行排序:
SELECT *
FROM a, b, c, d
WHERE b.aid=a.id AND c.id=a.cid AND a.did=d.id AND a.did='XXX'
ORDER BY a.status
有效。但是,它很慢。我弄清楚这是因为ORDER BY子句和表“a”上没有任何索引。
所有四个表都在“id”列上设置了PRIMARY KEY。
所以,我知道我需要为表格a添加索引,其中包含“状态”列,但还需要包含哪些内容? “出价”,“cid”和“did”也应该在那里吗?
我试图在一般的SQL意义上提出这个问题,但是,如果它很重要,那么目标就是用于Gears的SQLite。
提前致谢,
杰克(诺布)答案 0 :(得分:4)
我会说它很慢,因为引擎在整个地方进行扫描而不是搜索。你的意思是做一个SELECT。*而不是吗?那也会更快,这里的SELECT *相当于。*,b。*,c。*,d。*。
如果在每个列上放置一个单独的索引,您可能会得到更好的结果:
您可以尝试使用ASCENDING订单将状态添加到第一个和第二个索引,以获得更高的性能 - 它不会受到伤害。
答案 1 :(得分:0)
我很好奇你是怎么解决问题是'ORDER BY子句和表上缺少任何索引“a”。我发现这有点可疑,因为主表上的表a上有一个索引,你稍后会说。
查看查询的性质以及我可以猜测数据的性质,我认为这个查询通常会产生与它使用的表的大小相比较少的结果,因此ORDER BY会非常便宜。当然,这只是猜测。
索引是否会有所帮助取决于表中的数据。查询优化器在执行查询时将使用哪些索引取决于许多不同的因素,其中一个最重要的因素是查找产生的预期结果数。
如果您要发布EXPLAINing查询的输出,那么有一件事情会有很大帮助。
答案 2 :(得分:0)
你试过加入吗?
在a.did = d.id上a.cid = c.id内部联接d的a.id = b.aid内部联接c上的内部联接b中选择* a.did ='XXX' 订购a.status
正确使用连接(left,richt,inner,outer)取决于表的结构
希望这会有所帮助