mysql explain 实例分析

今天有同学在群里面问了这样一个问题:

select t1.*,t2.* from T1 t1 ,T2 t2 where t1.a = t2.a;

select t1.*,t2.* from T1 t1 join T2 t2 on t1.a = t2.a;
是一样的吗?

通过伟大的搜索引擎,我找到这样一个回答:

FROM T1,T2是ANSI SQL-89的旧语法,用逗号分隔FROM子句出现的表名,没有JOIN关键字,也没有ON子句,它只支持交叉联接和内联接,不支持外联接;如果没有指定联接条件就是一个交叉联接。
新的ANSI SQL-92去掉了逗号,引入了JOIN和ON,支持交叉联接、内联接和外联接。
优化器为使用上面两种语法的语句生成了相同的执行计划,性能是一样的。

虽然提问的同学对这个答案很满意,但是还是有同学对这个答案提出了自己的怀疑。于是我试图去证明这个答案的正确性。

由于已经找不到 SQL-89 的语法标准,所以关于 SQL-89 和 SQL-92 的比较只好暂时搁置。

我们来看一下 MySQL 优化器为上面两种语法的语句的执行计划是不是一样的:

mysql> explain extended select wp_users.display_name, wp_posts.post_title from wp_users, wp_posts where wp_users.ID = wp_posts.post_author;

B17B541C-A33A-419B-ACF2-5FF2118EEA35

mysql> show warnings;

B073A197-A1C3-4705-B2CF-D75CAE050539

mysql> explain extended select wp_users.display_name, wp_posts.post_title from wp_users join wp_posts on wp_users.ID = wp_posts.post_author;

3E6D5496-AAD3-4532-8FD3-913316BB3860

mysql> show warnings;

7551B96F-193D-4D48-A5D5-E75C8B64C008

我直接使用 wordpress 数据库,分别使用两种语法写了两条查询语句:

select wp_users.display_name, wp_posts.post_title from wp_users, wp_posts where wp_users.ID = wp_posts.post_author

select wp_users.display_name, wp_posts.post_title from wp_users join wp_posts on wp_users.ID = wp_posts.post_author

使用 mysql explain extended 和 show warnings 命令得到 mysql 优化器优化后的查询语句是一模一样的。

select `blog`.`wp_users`.`display_name` AS `display_name`,`blog`.`wp_posts`.`post_title` AS `post_title` from `blog`.`wp_users` join `blog`.`wp_posts` where (`blog`.`wp_posts`.`post_author` = `blog`.`wp_users`.`ID`)

参考


T-SQL查询笔记4: FROM T1,T2与联接的区别
http://www.cnblogs.com/gdjlc/archive/2012/03/06/2382820.html

MySQL执行计划解读
http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html

 753 total views,  2 views today

Leave a Reply

Your email address will not be published. Required fields are marked *