php为什么分开查询(非子查询)比join还快?

wyc9296 2017-09-19 04:18:10
公司的电脑不能装oracle 8可视化软件,所以看不了计划开销,好坑…
最近搭了一个网页,获取用户输入(product_name,material,deliver),然后查询oracle。

用的是perl/php里面的数据库模块,其中的sql是这样的:
select p.product_name, d.material, d.deliver, o.supervisor from operator o, detail d, product p where o.operator_id =d.operator_id and o.product_id=p.product_id and p.product_name in (用户输入的两百多个product) and d.material ='用户输入' and d.deliver='用户输入'

其中operator,detail都是百万级的表,product会小一些。operator>detail>>product。

事实上这样的代码运行需要1分钟;但是如果用perl/php分开运行,先得到product_id,再通过它得到operator_id,最后得到对应的supervisor,会快很多,只要5秒钟。因为怕数据库缓存查询数据,运行完了我等了很久再运行第二次的,时间上应该不会有问题。
这是为什么啊,然后我还试过子查询,速度一样很慢。


oracle板块的朋友让我来php板块问,有高人可以指点一下吗?
...全文
253 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyc9296 2017-11-20
  • 打赏
  • 举报
回复
不好意思诸位,不小心点了无满意结贴…
jip0303 2017-09-21
  • 打赏
  • 举报
回复
in子句经常会比较坑 合适的时候可以换成inner join 或者 不用联查 举个例子: select id, name, cat_id from table2 where cat_id in (select id from table1 where pid=6); 执行过程是:拿table2的一条条数据的cat_id和table1一条条数据的id对比,一样的话,再检验该条table1数据pid是否=6 能大大减少数据量的where pid=6被最后执行了 换成inner join情况就好很多了,不过临时表没有索引宜小不宜大,也不要进行排序分组啥的操作 select id, name, cat_id from table2 inner join (select id from table1 where pid=6) as tmp on table2.cat_id=tem.id;
zarte 2017-09-21
  • 打赏
  • 举报
回复
你试下子查询和先建视图在查询看看。
zarte 2017-09-21
  • 打赏
  • 举报
回复
发到数据库板块会好点。
kyzy_yy_pm 2017-09-21
  • 打赏
  • 举报
回复
连表是笛卡尔基方式,数据少看不出来甚至连表比单查好稍稍快,但是当数据多的时候就受不了了,就如同数据少时候2 x 2 = 4,当数据多的时候就是 2000000 x 20000000 = xxxxxxxxxxxxxxxxxxxxxx
wyc9296 2017-09-19
  • 打赏
  • 举报
回复
引用 1 楼 lmbby的回复:
百万级别的表用连表查询,查询条件还用in必然会很慢吧。分开查询运用索引
关键是分开查询也是用的in语句啊。因为用户网页输入的是很多的product_name,应该只能用in吧?有什么好的建议吗?
l43 2017-09-19
  • 打赏
  • 举报
回复
百万级别的表用连表查询,查询条件还用in必然会很慢吧。分开查询运用索引

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧