在后臺(tái)列表一頁只顯示10條的情況下
聯(lián)表查詢:
關(guān)聯(lián)所有需要的表一次查完
查詢之后foreach循環(huán)內(nèi)再查詢別的表組裝數(shù)據(jù):
比如order先查10條,然后foreach循環(huán)的時(shí)候再查詢用戶表、商品表、地址表等等
以上兩種方式那種性能好點(diǎ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ù)庫的操作,用程序去控制。
我們是不允許使用聯(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)));
主要看數(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í)表。
數(shù)據(jù)多可以查出數(shù)據(jù)后根據(jù)訂單標(biāo)識(shí)In后續(xù)數(shù)據(jù)再進(jìn)行php自己遍歷整合會(huì)好點(diǎn)吧