为了账号安全,请及时绑定邮箱和手机立即绑定

有什么方法可以代替联表

有什么方法可以代替联表

PHP
MMMHUHU 2019-03-05 08:22:11
现在有个功能事需要进行好几个表的很多字段的筛选,联表会不会很影响速度,如果会有什么方法代替联表!好吧!!我想太多了。实际联了下 速度好像没怎么影响。。不知道数据量大了怎么样
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

  1. 看硬件
  2. 看索引
  3. 多数情况下没那么容易因为联表查询而导致性能瓶颈,如果有,先检查前面两个,然后优化表结构、SQL语句、引擎参数
  4. 实在要避免联表,那只能单表拿数据自己在应用层做合并,但是这样你不能保证内存中每个表的数据都是最新的。
查看完整回答
反对 回复 2019-03-18
?
www说

TA贡献1775条经验 获得超8个赞

你连表查是有主表的条件查询吗,我今天也遇到这个问题了。我一开始就是jeftjoin之后跟where条件,但是这样会先将两个表的数据都连起来最后再去执行这个where,就会很慢,我用navicat执行了下sql语句,要10s以上。因为我是用laravel的框架,所以我改成了先查主表,然后在model层里写一个方法去查询另外表里的数据返回来,这样就快了很多。应该跟子查询差不多的意思吧。但是项目里不给我用db的写法,要我用orm,我就这样写了。

查看完整回答
反对 回复 2019-03-18
?
SMILET

TA贡献1796条经验 获得超4个赞

我没测试过性能。

不过如果打算不进行联表查询的话,就通过 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 联表查询:

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);
}

// 符合条件的结果
print_r($res);
查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 318 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信