知识点回顾:
我们都知道我们写的sql和mysql执行的sql其实并不是一个,mysql内部有一个“查询优化器”,当我们提交sql时,我们的sql会先被这个优化器优化,然后再将sql交给“查询执行引擎”执行,如下图:
现象描述:
今天偶然发现被“查询优化器”优化后的sql竟然出现了这么一段sql:where 1,这是什么意思呢?
原始sql:
select un.unit_name,bu.building_name ,ba.batch_name from tb_mdm_unit un left join tb_mdm_building bu on un.building_id = bu.id left join tb_mdm_batch ba on bu.batch_id = ba.id limit 0,100;
查询优化器优化后的sql:
SELECT `sunacwy_mdm`.`un`.`unit_name` AS `unit_name`, `sunacwy_mdm`.`bu`.`building_name` AS `building_name`, `sunacwy_mdm`.`ba`.`batch_name` AS `batch_name` FROM `sunacwy_mdm`.`tb_mdm_unit` `un` LEFT JOIN `sunacwy_mdm`.`tb_mdm_building` `bu` ON (( `sunacwy_mdm`.`bu`.`id` = `sunacwy_mdm`.`un`.`building_id` )) LEFT JOIN `sunacwy_mdm`.`tb_mdm_batch` `ba` ON (( `sunacwy_mdm`.`ba`.`id` = `sunacwy_mdm`.`bu`.`batch_id` )) WHERE 1 LIMIT 0, 100
怎么查看优化器优化后的sql:
使用explain extended 对sql进行分析后,执行show warnings,即可查看sql了
设想:
我测试了其他几个场景:where 2,where 3等发现查询的数据内容与不加where是一模一样的,又测试了where 0,发现查出来的数据就变成了0条,因此猜测:这里的1指代true,0指代false,相当于java里面的while(true)和while(false)。
结论:
目前没找到支撑猜测的可靠官方文字,估计八九不离十吧,where 后面跟上非0数字代表true,0就是false了。true时查询全部数据,false时数据均被过滤。