|
原帖由 cyt2005 于 2008-1-19 11:26 发表 ![]()
呵呵
首先 jinguanding 老兄
left join跟inner join 不同我晓得,但是斑竹给我的回复,让我有点迷惑
我也觉得explain的结果很理想的,这个语句是开发写的,这个是最里层的sql,他在网页上还是对这个结果集再次进行操作比如分页显示啥的
语句已经是我优化过一次的了。。。。
你说的时间花在了,这点我不太明白
可否进一步说明一下呢?生成执行计划会用这么长时间么?
执行计划。。。。就是优化器根据所设计到的表统计信息,使用到的索引信息,以及语句分析后(也即通过优化器进行优化过的)语句,提交给mysql服务器执行,
你使用explain看到的信息就是通过优化期进行优化后,可能需要扫描的记录与使用到的索引信息。。。。都是这步完成的。。。
explain的信息,跟真正执行时所预期的,有可能会存在区别的。。。。
其实,还有部分内容,我没有说有关I/O的问题,因为数据量大的话。。就不能全部加载到内存中,需要不停地切换地读入新记录进行比较。。。。。而比较运算就需要使用到CPU。。。。。这块元老 NiGoo。。。。已经解释了。。。
若你使用存储过程实现这个语句的话,你的执行计划就可以缓存起来。。。这也就是为什么使用存储过程查询执行快的其中一个原因。。。
若你的记录修改的机会少的话,你可以把这个查询语句的数据结果缓存起来。。第二进行就会更快。。。。。。
兄弟,说句心得的话。。。。。所谓数据库的优化就是寻找一个平衡点。。。追求最佳解的过程。。。具体的情况需要具体的 分析。。。
我建议你先使用这样的语句,,,,,可能需要再进行适当的调整。。。。。若效果还达不到你所需要的效果。。。你可以考虑听NiGoo大师的方式,进行业务逻辑层的修改。。把语句进行拆分。。。。。。这是这样 可能就出现另外两个问题。。。程序需要修改而且可能会比较大(逻辑要增加),另外一个可能会增加网络流量。。。。
另外一个解决办法就是考虑使用存储过程去解决多表的连接的问题。。。。。让程序调用的是一个存储过程。。。。
我就说这么多了。。。。。那个有效。。。需要在实际生产环境下,根据实际的情况进行调整语句,,以及测试下了。。。。
我现在羡慕你们有机会去测试与实践自己的方案,以及有机会碰到问题啊。。。。。。。我只能看看大家发上了贴了。。。。发表下不知道是否合理的解决方案(因为没有测试过)。。。。。今天喝点酒。。所以就多说了点。。请LZ ,杨兄,NiGoo见谅! |
|