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

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

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

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

你連表查是有主表的條件查詢嗎,我今天也遇到這個問題了。我一開始就是jeftjoin之后跟where條件,但是這樣會先將兩個表的數(shù)據(jù)都連起來最后再去執(zhí)行這個where,就會很慢,我用navicat執(zhí)行了下sql語句,要10s以上。因為我是用laravel的框架,所以我改成了先查主表,然后在model層里寫一個方法去查詢另外表里的數(shù)據(jù)返回來,這樣就快了很多。應該跟子查詢差不多的意思吧。但是項目里不給我用db的寫法,要我用orm,我就這樣寫了。

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

我沒測試過性能。

不過如果打算不進行聯(lián)表查詢的話,就通過 php 語句來處理:

比如有表 DDL 語句:

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

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

要求:符號 A.id in (1 , 2 , 3) 并且 A.course_id 對應 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