国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

聯(lián)表一次查詢和查詢后循環(huán)內(nèi)再查詢別的表組裝數(shù)據(jù),哪個(gè)性能好呢?

timeless-zyg

問題描述

在后臺(tái)列表一頁只顯示10條的情況下
聯(lián)表查詢:
關(guān)聯(lián)所有需要的表一次查完
查詢之后foreach循環(huán)內(nèi)再查詢別的表組裝數(shù)據(jù):
比如order先查10條,然后foreach循環(huán)的時(shí)候再查詢用戶表、商品表、地址表等等

以上兩種方式那種性能好點(diǎn)呢?

749 7 2
7個(gè)回答

xiaoming

with ?

nitron

拋開具體總量談沒什么意義,兩種都可以
理論上,索引建得好,訂單表量少第一種,量大第二種

注意:理論上

  • timeless-zyg 2024-12-09

    弄了點(diǎn)測(cè)試數(shù)據(jù) 第二種查詢速度快點(diǎn)

張文遠(yuǎn)

方案一:foreach循環(huán)查詢用戶表、商品表等,肯定是最差的,循環(huán)中多次查詢不可取。
方案二:優(yōu)化成先查訂單,再拿訂單id去in語法一次查出對(duì)應(yīng)的用戶、商品數(shù)據(jù),再手動(dòng)組裝。這種方式就是關(guān)聯(lián)模型的處理方案,實(shí)現(xiàn)方式是分開多次查的,用的in 語法。
使用多次查詢會(huì)走更多的IO,效率相對(duì)來說較低。
方案三:join連表的話一次查詢返回,這種執(zhí)行的sql效率高,但是sql服務(wù)壓力大。
如果是我,我會(huì)使用使用方案二:
1.SQL語句比較簡單,可以用關(guān)聯(lián)模型輕松實(shí)現(xiàn),相比join心智負(fù)擔(dān)更少;
2.現(xiàn)在程序的瓶頸往往不在編程語言而在數(shù)據(jù)庫,盡量減輕單次數(shù)據(jù)庫的操作,用程序去控制。

  • timeless-zyg 2024-12-09

    跑了下 這三種查詢方式 綜合下來第二種速度快點(diǎn)

liziyu

有的團(tuán)隊(duì)明確要求盡量不聯(lián)表,推薦單獨(dú)查出來后再組裝。

  • 暫無評(píng)論
army

我們是不允許使用聯(lián)表查詢的,只能用簡單的查詢語句。
這種場(chǎng)景我們是這樣的, 查詢order列表,用foreach去便利查詢結(jié)果得到所有其他表所需的id,
再用or去查詢用戶表、商品表、地址表,也就是總共只需要4條sql

        $orderArr = DB::find('order', $cond, array('id' => -1), $page, 10);
        $order_ids = [];
        $user_ids = [];
        foreach ($orderArr as $v) {
            $order_ids[] = $v['id'];
            $user_ids[] = $v['user_id'];
        }
        // 搶單列表
        $robinArr = DB::find('order_robin', array('order_id' => $order_ids), array(), 1, 500);
        // 用戶數(shù)據(jù)
        $userArr = DB::find('user', array('id' => array_unique($user_ids)));
        // 用戶頭像
        $avatarArr = DB::find('user_avatar', array('user_id' => array_unique($user_ids)));
  • army 2024-12-10

    至于為什么要用or不是in,自己測(cè)試

  • muyu 2024-12-10

    沒看到哪里用or代替in的啊

  • 釋永戰(zhàn) 2024-12-16

    OR可以用到索引,用IN就不能使用索引了

  • muyu 2024-12-17

    開什么玩笑,id一般都是主鍵,你無論是or還是in都走的索引,區(qū)別就是需不需要回表獲取其他數(shù)據(jù)~

wgole

主要看數(shù)據(jù)量的大小,如果數(shù)據(jù)比較大:
1、foreach方式最優(yōu)先pass,這種效率最低;
2、用join的話表數(shù)量太多或者索引設(shè)置不對(duì),效率也大大降低;
3、用in的話,in的數(shù)量太大效率也下降很快;

我的解決方案是:
創(chuàng)建臨時(shí)表 create temporary table,先把需要連表查詢的id列表查出來,然后再把id列表存到臨時(shí)表,然后用臨時(shí)表join其他表查詢,而且當(dāng)前進(jìn)程處理完,php回收機(jī)制自動(dòng)釋放該臨時(shí)表。

  • 暫無評(píng)論
TM

數(shù)據(jù)多可以查出數(shù)據(jù)后根據(jù)訂單標(biāo)識(shí)In后續(xù)數(shù)據(jù)再進(jìn)行php自己遍歷整合會(huì)好點(diǎn)吧

  • 暫無評(píng)論
??