如何创建SQL索引以提高ORDER BY性能

时间:2009-06-18 08:23:19

标签: sql sqlite indexing sql-order-by

我有一些类似于以下的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。

提前致谢,

杰克(诺布)

3 个答案:

答案 0 :(得分:4)

我会说它很慢,因为引擎在整个地方进行扫描而不是搜索。你的意思是做一个SELECT。*而不是吗?那也会更快,这里的SELECT *相当于。*,b。*,c。*,d。*。

如果在每个列上放置一个单独的索引,您可能会得到更好的结果:

  • a.did(这样a.did ='XXX'是搜索而不是扫描,也有助于a.did = d.id)
  • a.cid(对于a.cid = c.id)
  • b.aid(对于a.id = b.aid)

您可以尝试使用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)取决于表的结构

希望这会有所帮助