[英]How To Create a SQL Index to Improve ORDER BY performance
我有一些类似于以下的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添加一个索引,其中包含“status”列,但还需要包含哪些内容? 应该“竞标”,“cid”和“did”也在那里吗?
我试图在一般的SQL意义上问这个问题但是,如果它很重要,那么目标就是用于Gears的SQLite。
提前致谢,
杰克(诺布)
我会说它很慢,因为引擎在整个地方进行扫描而不是寻找。 你的意思是做一个SELECT。*而不是吗? 那也会更快,这里的SELECT *相当于。*,b。*,c。*,d。*。
如果在每个列上放置一个单独的索引,您可能会得到更好的结果:
你可以尝试使用ASCENDING命令将状态添加到第一个和第二个索引,以获得额外的性能 - 它不会受到伤害。
我很好奇你是怎么解决问题是'ORDER BY子句和表上缺少任何索引“a”。 我发现这有点可疑,因为主要密钥上的表a上有一个索引,您稍后会说。
看看查询的本质以及我可以猜测的数据的性质,我认为这个查询通常会产生相对较少的结果,而不是它使用的表的大小,因此ORDER BY会非常贱。 当然,这只是猜测。
索引是否甚至可以帮助取决于表中的数据。 查询优化器在执行查询时将使用哪些索引取决于许多不同的因素,其中一个重要因素是查找产生的预期结果数。
如果您要发布EXPLAINing查询的输出,那么有一件事情会有很大帮助。
你试过加入吗?
从A.did = d.id上的a.cid = c.id内部联接d上的a.id = b.aid内部联接c中的内部联接b中选择*,其中a.did ='XXX'ORDER BY a.status
正确使用连接(left,richt,inner,outer)取决于表的结构
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.