MySql 表连接问题 条件

当我成回忆 发布于 2016/12/16 18:27
阅读 254
收藏 0

各位大虾好,我碰到一个问题不是很清楚,所以请教请教大家,望不吝赐教。

测试一个模块发现执行时间太长了,所以调出sql大概看了下,由于对MySql不是很熟,所以不是很清楚原理,sql如下:

select 
    dcm.DPRODUCTIONDATE,
    dcm.slinkserialnox
from ec_SysOrganization org
left join ec_XLOrganCostAndOutput dcm on 1=1

    and dcm.DPRODUCTIONDATE = '2016-03-01' -- 这个很慢

    -- and dcm.DPRODUCTIONDATE <= '2016-03-01' and dcm.DPRODUCTIONDATE >= '2016-03-01' -- 这个很快
    and dcm.slinkserialnox like CONCAT('001','%')
where 1=1
    and org.SORGANIZATIONTYPE = 'BS07J'
    and dcm.slinkserialnox like CONCAT(org.slinkserialno,'%') 
    and org.istatus = '0'

很慢的执行时间: 

很慢的执行计划:


很快的执行时间:


很快的执行计划:

extra栏内容:Using index condition; Using where; Using MRR; Using join buffer (Block Nested Loop)


对比extra内容就可以大概知道,MySql优化器做了优化,由于对MySql没有很深入,所以只能猜测,估计是优化器碰到这种范围条件的就会采取一些手段,and dcm.DPRODUCTIONDATE = '2016-03-01'这个条件优化器就一条一条去比对,这样就当然慢了,但碰到and dcm.DPRODUCTIONDATE <= '2016-03-01' and dcm.DPRODUCTIONDATE >= '2016-03-01'就不同了,一系列手段都用上了,不知道是不是这么个理,所以请教大家给个专业,系统性的答案。

最后大家有没有关于MySql的书籍,比较全面系统的,也比较深入的,让我这个半吊子水平也能有所增长,最后谢谢大家的回答。






加载中
0
宏哥
宏哥

Mysql 只能做单表CRUD

把所有数据放到一张表里面

--mysqlers

0
返回顶部
顶部