鍍金池/ 問(wèn)答/PHP  數(shù)據(jù)庫(kù)  HTML/ 有什么方法可以代替聯(lián)表

有什么方法可以代替聯(lián)表

現(xiàn)在有個(gè)功能事需要進(jìn)行好幾個(gè)表的很多字段的篩選,聯(lián)表會(huì)不會(huì)很影響速度,如果會(huì)有什么方法代替聯(lián)表!
好吧??!我想太多了。實(shí)際聯(lián)了下 速度好像沒(méi)怎么影響。。不知道數(shù)據(jù)量大了怎么樣

回答
編輯回答
涼汐
  1. 看硬件
  2. 看索引
  3. 多數(shù)情況下沒(méi)那么容易因?yàn)槁?lián)表查詢而導(dǎo)致性能瓶頸,如果有,先檢查前面兩個(gè),然后優(yōu)化表結(jié)構(gòu)、SQL語(yǔ)句、引擎參數(shù)
  4. 實(shí)在要避免聯(lián)表,那只能單表拿數(shù)據(jù)自己在應(yīng)用層做合并,但是這樣你不能保證內(nèi)存中每個(gè)表的數(shù)據(jù)都是最新的。
2017年9月27日 03:14
編輯回答
尐飯團(tuán)

你連表查是有主表的條件查詢嗎,我今天也遇到這個(gè)問(wèn)題了。我一開(kāi)始就是jeftjoin之后跟where條件,但是這樣會(huì)先將兩個(gè)表的數(shù)據(jù)都連起來(lái)最后再去執(zhí)行這個(gè)where,就會(huì)很慢,我用navicat執(zhí)行了下sql語(yǔ)句,要10s以上。因?yàn)槲沂怯胠aravel的框架,所以我改成了先查主表,然后在model層里寫(xiě)一個(gè)方法去查詢另外表里的數(shù)據(jù)返回來(lái),這樣就快了很多。應(yīng)該跟子查詢差不多的意思吧。但是項(xiàng)目里不給我用db的寫(xiě)法,要我用orm,我就這樣寫(xiě)了。

2018年9月10日 14:39
編輯回答
裸橙

我沒(méi)測(cè)試過(guò)性能。

不過(guò)如果打算不進(jìn)行聯(lián)表查詢的話,就通過(guò) php 語(yǔ)句來(lái)處理:

比如有表 DDL 語(yǔ)句:

create table A (
    id int primary key auto_increment not null , 
    name varchar(255) comment '名稱' , 
    course_id int comment '對(duì)應(yīng)B.id' ,
);

create table B (
    id int primary key auto_increment not null , 
    course varchar(255) comment '課程名稱'
);

要求:符號(hào) A.id in (1 , 2 , 3) 并且 A.course_id 對(duì)應(yīng) B 表中的 course 字段包含 test 值的所有記錄。

SQL 聯(lián)表查詢:

select * from A inner join B on a.course_id = B.id where A.id in (1 , 2 , 3) and B.course like '%test%';

PHP 查詢:

$sql = "select * from A where id in (1 , 2 , 3)";
$data = \DB::query($sql);

$res = [];
foreach ($data as $v)
{
    $sql = "select * from B where id = {$v} and course like '%test%'";
    $part = \DB::query($sql);
    $res = array_merge($v , $part);
}

// 符合條件的結(jié)果
print_r($res);
2018年7月27日 14:14