|
回复 #13 jinguanding 的帖子
原帖由 jinguanding 于 2011-3-11 17:41 发表 ![]()
EXPLAIN
SELECT a.MeiShiID,a.Title,a.Picture,a.HitNum,a.MainMaterials2,a.Adminicle2,a.Spice2,a.HitNum
FROM a left join b ON a.MeiShiID=b.MeiShiID AND b.GongXiaoID=1040700
WHERE Updated>'2011-03-05' AND Updated'2011-03-05' AND Updated
改成上述对你的业务逻辑没有问题的话,就可以继续修改为(注:因之前的写法为非标准的左连接):
EXPLAIN
SELECT T.*
FROM (SELECT a.MeiShiID,a.Title,a.Picture,a.HitNum,a.MainMaterials2,a.Adminicle2,a.Spice2,a.HitNum FROM a WHERE Updated>'2011-03-05' AND Updated<'2011-03-12' ORDER BY a.HitNum DESC LIMIT 0,10) T
LEFT JOIN b ON T.MeiShiID=b.MeiShiID AND b.GongXiaoID=1040700
上面的第一个修改我是这样理解的,符合a.MeiShiID=b.MeiShiID AND b.GongXiaoID=1040700才进行左连接,这样就减小了左连接的数据量。我对左连接时索引的使用情况和原理不是很理解,要是兄台能对这方面说说就更好了。
第一个修改的执行顺序,我的理解是这样的:a.MeiShiID=b.MeiShiID AND b.GongXiaoID=1040700判断后再左连接成一个结果集,然后再根据where语句进行过滤,limit 0,10,最后再ORDER BY a.HitNum DESC
第二个修改的执行顺序:对A表Updated>'2011-03-05' AND Updated<'2011-03-12' ORDER BY a.HitNum DESC LIMIT 0,10后,得到10个结果后跟B表进行 ON T.MeiShiID=b.MeiShiID AND b.GongXiaoID=1040700的左连接。
我的疑惑在于,limit 条件在左连接前执行不是会对最终的结果产生影响吗?
呵呵,不好意思,这两天俗事缠身,这么晚才上来看。这句其实不是我写的,只是跑出来的慢查询语句,想到过INNER JOIN会好一点点,但这对性能上的影响很小, 实在想不到更好的修改方案。
[ 本帖最后由 wanan_YLF 于 2011-3-13 22:52 编辑 ] |
|