繁体   English   中英

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

[英]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。*。

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

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

你可以尝试使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM