现在有个功能事需要进行好几个表的很多字段的筛选,联表会不会很影响速度,如果会有什么方法代替联表!好吧!!我想太多了。实际联了下 速度好像没怎么影响。。不知道数据量大了怎么样
3 回答
![?](http://img1.sycdn.imooc.com/533e4c1500010baf02200220-100-100.jpg)
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
- 看硬件
- 看索引
- 多数情况下没那么容易因为联表查询而导致性能瓶颈,如果有,先检查前面两个,然后优化表结构、SQL语句、引擎参数
- 实在要避免联表,那只能单表拿数据自己在应用层做合并,但是这样你不能保证内存中每个表的数据都是最新的。
![?](http://img1.sycdn.imooc.com/545847f50001126402200220-100-100.jpg)
www说
TA贡献1775条经验 获得超8个赞
你连表查是有主表的条件查询吗,我今天也遇到这个问题了。我一开始就是jeftjoin之后跟where条件,但是这样会先将两个表的数据都连起来最后再去执行这个where,就会很慢,我用navicat执行了下sql语句,要10s以上。因为我是用laravel的框架,所以我改成了先查主表,然后在model层里写一个方法去查询另外表里的数据返回来,这样就快了很多。应该跟子查询差不多的意思吧。但是项目里不给我用db的写法,要我用orm,我就这样写了。
![?](http://img1.sycdn.imooc.com/5333a0aa000121d702000200-100-100.jpg)
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);
- 3 回答
- 0 关注
- 318 浏览
添加回答
举报
0/150
提交
取消