網上查詢的,自用
做phpexcel**匯出的時候,我的資料庫主表裡記錄的都是一些關聯資料的id,之前的做法是先將資料查詢出來之後,用foreach 迴圈,根據關聯id取出需要的資料。這在資料量小的時候沒有問題,但是當資料超過1000條之後,查詢時間會超過40s,造成超時。
所以優化查詢語句,用關聯查詢直接輸出所需資料。
1,關聯查詢:
join等價bai於inner join內連線,是返回兩個表中du都有的符合條件的行zhi。
left join左連線,是返回左表中所有的行及右表中符合dao條件的行。
right join右連線,是返回右表中所有的行及左表中符合條件的行。
full join全連線,是返回左表中所有的行及右表中所有的行,並按條件連線。
通常情況下,left join肯定比inner join返回的行數多。
文章二文章三
文章四
3.left join 右表裡有多條記錄與主表對應,只取一條記錄的方法
left join (select uid,id,name from weixin group by uid) b on a.id=b.uid
如上**段所示,依據uid判斷重複的記錄,group by ,只顯示一條記錄。
若是group by查詢較慢,也可這樣寫,在group by之前增加乙個where條件,速度馬上就上來。
left join (select uid,id,name from weixin where 索引條件 group by uid) b on a.id=b.uid
當然也可以用distinct來去重
4,記錄一下yii框架的查詢,綜合了多種方式
//子查詢作為連線主表 3.15s
$subsql = (new \yii\db\query())->select(['w.zjdid','w.companyid','w.workerid','w.remarks','w.ctime','w.result','z.name','z.shbh'])
->from("worker_xj as w")
->leftjoin("zjd as z", "w.zjdid = z.id")
->where($where1)
->orderby('w.ctime desc')
;//dd($subsql);
$qcsql = (new \yii\db\query())->select(["distinct `no` as shbh","address as shdz"])
->from('customer');
//dd($qcsql);
$xjlist = (new \yii\db\query())
->select(['c.name as company','a.name as worker','subsql.remarks','subsql.ctime','subsql.result','subsql.name as shmc','subsql.shbh','qcsql.shdz'])
->from(['subsql' => $subsql])
->leftjoin('company as c','c.id = subsql.companyid')
->leftjoin('adminuser as a','a.id = subsql.workerid')
->leftjoin(['qcsql' => $qcsql],'qcsql.shbh = subsql.shbh')
->all();
這裡$subsql 是子查詢作為連線主表 $qcsql 是為了去重右表 sql 如何提高SQL查詢的效率?
如何提高sql查詢的效率?原創猴子聊人物 發布於2019 10 31 21 00 00 閱讀數 11195 收藏 展開 題目 我們公司的資料量非常大,需要的不僅僅是提取資料,要了解sql方案優化的。一般在寫sql時需要注意哪些問題,可以提高查詢的效率?解題思路 資料量大的情況下,不同的sql語句,消...
如何提高SQL查詢的效率?
1.select子句中盡量避免使用 select子句中,是選擇全部資料的意思,比如語句 select from 成績表 意思是選擇成績表中所有列的資料 面對動輒十萬 百萬,甚至上千萬的資料,此時需要哪些列的資料,就提取哪些列的資料,盡量少用 來獲取資料 2.where子句比較符號左側避免函式 盡量避...
批處理SQL語句的執行效率提高的方法
如果專案要求程式對高達幾萬條的資料在集中的時間內執行固定序列的操作,且不能完全使用儲存過程時而需要使用程式來執行時。會需要這些優化。我們知道,sql伺服器對一條語句的執行,需要分析 編譯 執行這些步驟,通過引數化我們可以對一種命令只分析和編譯一次,而執行多次,從而提高效率。在執行時,如果每次提交語句...