猿问

有什么方法可以代替联表

现在有个功能事需要进行好几个表的很多字段的筛选,联表会不会很影响速度,如果会有什么方法代替联表!
好吧!!我想太多了。实际联了下 速度好像没怎么影响。。不知道数据量大了怎么样

MMMHUHU
浏览 319回答 3
3回答

翻翻过去那场雪

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

www说

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

SMILET

我没测试过性能。 不过如果打算不进行联表查询的话,就通过 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);
随时随地看视频慕课网APP
我要回答