mysql SELECT LEFT JOIN ON 查询总是超时,大侠能帮忙优化一下吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql SELECT LEFT JOIN ON 查询总是超时,大侠能帮忙优化一下吗?相关的知识,希望对你有一定的参考价值。
语句是这样的,一个 条码信息 fcoa_ean 表,需要通过里面的ean_sku字段来对应 产品信息 fcoa_product 表里的产品信息,然后产品信息表里又有一些字字段是有从表字段的,如颜色、规格等。SELECT `fcoa_ean`.ean_ean, `fcoa_ean`.ean_sku, `fcoa_product`.product_kis, `fcoa_product`.product_number, `fcoa_product`.product_item, `fcoa_type`.type_name, `fcoa_product`.product_name, `fcoa_color`.color_name, `fcoa_specification`.spec_name, `fcoa_sku`.sku_date FROM fcoa_ean LEFT JOIN `fcoa_sku` ON `fcoa_ean`.ean_sku = `fcoa_sku`.sku_sku LEFT JOIN `fcoa_product` ON `fcoa_sku`.sku_product_id = `fcoa_product`.product_id LEFT JOIN `fcoa_color` ON `fcoa_sku`.sku_color = `fcoa_color`.color_id LEFT JOIN `fcoa_specification` ON `fcoa_sku`.sku_spec = `fcoa_specification`.spec_id请帮忙优化一下语句,谢谢! LEFT JOIN `fcoa_type` ON `fcoa_product`.product_type = `fcoa_type`.type_id WHERE `fcoa_ean`.ean_sku IS NOT NULL ORDER BY `fcoa_ean`.ean_id LIMIT
加过索引了么?
这些如果不是主键的话,先把索引加上
追问加了索引了,但是应用程序依然提示超时,每页20条数据,只出来10-15条左右,就提示超时:Fatal error: Maximum execution time of 30 seconds exceeded in G:\AppServ\www\FCOA\ean_list.php on line 248
追答你这个错误 是php报的,你确认是sql执行超时么?会不会是页面逻辑有超时的情况
你自己在sql客户端执行也是很久么?
在SQL直接执行是没有问题,一样的代码,在WEB程序上就执行错误,不清楚是什么原因?从提示的错误来看,是超时导致的。
追答对呀 那就不是sql的问题了,好好排查一下吧 是在哪个环节超时了
追问我把代码全啊删除,只留这句,以及数据列表,还是这样提示。。。
参考技术A 是你的应用程序执行这条查询超时,还是数据库执行超时,如果是应用程序超时的话,你可以把sql打出来放到数据库里执行以下看会不会超时,另外可以在关联的字段上建立索引,用explain分析有没有利用到索引追问是应用程序执行超时,每页20条数据,只出来10-15条左右,就提示超时:Fatal error: Maximum execution time of 30 seconds exceeded in G:\AppServ\www\FCOA\ean_list.php on line 248
追答那就是php代码有问题了,并不是sql语句的问题,代码的问题要一一排查,这种情况一般是代码里某个操作导致的,比如你的代码初始化的时候连了一个ftp,ftp服务挂了的时候就可能会超时,比如初始化的时候连了redis,redis挂了就会超时(例子举得可能不准,但应该是类似的),错误代码可能是在construct里 ,可能在父类里 ,可能在include的文件里
追问好的。谢谢。学习了,感谢您的解答!
MySql查询select from 两个表与left join on的区别
直接看sql:
mysql>
select
*
from
a;
+
------+------+
| id | col |
+
------+------+
| 1 | 11 |
| 2 | 12 |
| 3 | 13 |
+
------+------+
3
rows
in
set
(0.00 sec)
mysql>
select
*
from
b;
+
------+------+
| id | col |
+
------+------+
| 2 | 22 |
| 3 | 23 |
| 5 | 25 |
+
------+------+
3
rows
in
set
(0.00 sec)
mysql>
mysql>
select
*
from
a,b
where
a.id=b.id;
+
------+------+------+------+
| id | col | id | col |
+
------+------+------+------+
| 2 | 12 | 2 | 22 |
| 3 | 13 | 3 | 23 |
+
------+------+------+------+
2
rows
in
set
(0.08 sec)
mysql>
select
*
from
a
left
join
b
on
a.id=b.id;
+
------+------+------+------+
| id | col | id | col |
+
------+------+------+------+
| 1 | 11 |
NULL
|
NULL
|
| 2 | 12 | 2 | 22 |
| 3 | 13 | 3 | 23 |
+
------+------+------+------+
3
rows
in
set
(0.00 sec)
mysql>
以上是关于mysql SELECT LEFT JOIN ON 查询总是超时,大侠能帮忙优化一下吗?的主要内容,如果未能解决你的问题,请参考以下文章
mysql SELECT LEFT JOIN ON 查询总是超时,大侠能帮忙优化一下吗?
mysql的inner join,left jion,right join,cross join以及on和where的区别
最全解释Mysql 的join中on与where 过滤条件差异