如何创建一个SQL索引提高ORDER BY性能
我有类似如下,其中第一的“状态”栏中加入四个表,然后对结果进行排序的一些SQL:如何创建一个SQL索引提高ORDER BY性能
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。
所以,我知道我需要添加一个索引表,其中包括“状态”列,但还需要包括什么? “bid”,“cid”和“did”也应该在那里吗?
我试图在一般的SQL意义上提出这个问题,但是,如果它很重要,那么目标是用于Gears的SQLite。
由于提前,
杰克(小白)
我会说这很慢,因为引擎正在扫描所有的地方,而不是寻求。你是否想要做SELECT a。*而不是?这也会更快,SELECT *在这里相当于a。*,b。*,c。*,d。*。
你可能会得到更好的结果,如果你把一个单独的索引上的每个列:
- a.did(使a.did =“XXX”是寻求替代的扫描,也帮助a.did = d.id)
- a.cid(用于a.cid = c.id)
- b.aid(用于a.id = b.aid)
你可以试试将状态添加到第一个和第二个索引并加上订单,以获得额外的性能 - 它不会发生吨。
你是如何工作的,这个问题是“ORDER BY子句和餐桌上没有任何指数的我很好奇,“一”。”我发现这有点可疑,因为表中有一个索引,在主键上,你稍后会说。
查看查询的性质以及我对数据性质的猜测,我认为与查询表使用的表的大小相比,该查询一般会产生相对较少的结果,因此ORDER BY将会非常便宜。当然,这只是一个猜测。
索引是否甚至会有所帮助取决于表中的数据。查询优化器在查询时将使用哪些索引取决于很多不同的因素,其中一个重要因素是查询产生的预期结果数量。
有一件事会帮助你很多,如果你会发布解释你的查询输出。
你试过连接吗?
select * from a inner join b on a.id = b.aid inner join c on a.cid = c.id inner join d on a.did = d.id where a.did ='XXX' ORDER BY a。状态
正确使用的连接(左,richt,内,外)取决于表
的结构希望这有助于
我发布的SQL是一个什么样的简化版本; S在使用中保存混乱。 实际上,我从每个表中选择了几个特定的列,但实际上并没有使用“*” 我会尝试添加三个索引并查看我如何实现的建议。 – 2009-06-18 08:58:51
太棒了!有效。从0.4秒到0.001秒!不能说比这更公平! 我的错误是,我试图让所有的列在一个索引中,而不是像你建议萨姆那样分散。 我真正需要做的是从第一原则学习SQL ...如果只有我有时间阅读书籍... 谢谢! – 2009-06-18 09:05:40