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 | + ------+------+ rows  in  set  (0.00 sec)   mysql>  select  from  b; + ------+------+ | id   | col  | + ------+------+ |    2 |   22 | |    3 |   23 | |    5 |   25 | + ------+------+ 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 | + ------+------+------+------+ rows  in  set  (0.08 sec)   mysql>  select  from  left  join  on  a.id=b.id; + ------+------+------+------+ | id   | col  | id   | col  | + ------+------+------+------+ |    1 |   11 |  NULL  NULL  | |    2 |   12 |    2 |   22 | |    3 |   13 |    3 |   23 | + ------+------+------+------+ rows  in  set  (0.00 sec)   mysql>

以上是关于mysql SELECT LEFT JOIN ON 查询总是超时,大侠能帮忙优化一下吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysql left join 可以不写on吗

mysql SELECT LEFT JOIN ON 查询总是超时,大侠能帮忙优化一下吗?

mysql的inner join,left jion,right join,cross join以及on和where的区别

最全解释Mysql 的join中on与where 过滤条件差异

MySQL中left join on后面的条件和where后面的条件的区别

ci框架中 select语句 和join语句 怎么用