淘客熙熙

主题:【求助】实现送花功能的SQL语法求助,回复者花 -- 卷心菜

共:💬23 🌺28 新:
全看分页树展 · 主题 跟帖
家园 重复计算就是浪费

从你的Query来看,每次需要显示板块列表时,你都需要运行这个Query,对吧?同样的计算系统需要重复做多次,为什么不优化一下,例如在ibf_topics表中加字段保存首发贴的花草数,或者单独加一个表以免影响原有表结构,只有当首发贴有送花草时才重新计算,这样不更好吗? 你的Query就可以简化成

select ibf_topics.*, ibf_topics_extend.rep_inc,ibf_topics_extend.rep_dec from ibf_topics,ibf_topics_extend on ibf_topics.topic_id = ibf_topics_extend.topic_id

如果你不想做上面的修改的话,回到你现在的Query,也有可以优化的地方,那就是不要使用Left Join,这会让系统先将ibf_topics和ibf_posts中的全部记录进行外键匹配后再根据forum_id做过滤,这就是我前面帖子说的全表扫描,如果千万级甚至更多的记录数,left join对资源的消耗就会大到你不能忽视的地步,这时候我们可以用函数来代替left join,你可以在性能监视器中观察两种方法的优劣.

Sample function fn_Get_rep_inc

(

@topic_id INT,

@author_id INT,

@post_date INT

)

returns @ref_inc INT

as

begin

select @ref_inc = ibf_posts.rep_inc from ibf_posts where toic_id=@topic_id and author_id=@author_id and post_date = @post_date

return

End

这样你的Query可以改成

select ibf_topics.*, fn_Get_rep_inc(ibf_topics.topic_id,ibf_topics.starter_id, ibf_topics.starter_date), fn_Get_rep_dec(ibf_topics.topic_id,ibf_topics.starter_id, ibf_topics.starter_date) from ibf_topics WHERE ibf_topics.forum_id=".$this->forum['id']."

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河