日期:2014-05-16  浏览次数:20821 次

急!请教个join连接查询效率的问题!
比如 select a.a1 a.a2 from A a inner join B b on b.aid=a.id where b.b1='bn1'

select a.a1,a.a2 from A a ,B b where b.aid=a.id and b.b1='bn1'

以上两个语句哪个效率高些呢?
特别是当查询条件多的时候,哪个查询效率高些呢?




------解决方案--------------------
两个效率难道不一样?
------解决方案--------------------
应该是一样的


你explain一下看看执行计划
------解决方案--------------------
探讨
比如 select a.a1 a.a2 from A a inner join B b on b.aid=a.id where b.b1='bn1'

select a.a1,a.a2 from A a ,B b where b.aid=a.id and b.b1='bn1'

以上两个语句哪个效率高些呢?
特别是当查询条件多的时候,哪个查询效率高些呢?

------解决方案--------------------
引用select a.a1 a.a2 from A a inner join B b on b.aid=a.id where b.b1='bn1'

select a.a1,a.a2 from A a ,B b where b.aid=a.id and b.b1='bn1'

------解决方案--------------------
探讨

引用:
引用:
比如 select a.a1 a.a2 from A a inner join B b on b.aid=a.id where b.b1='bn1'

select a.a1,a.a2 from A a ,B b where b.aid=a.id and b.b1='bn1'

以上两个语句哪个效率高些呢?
特……

------解决方案--------------------
探讨

引用:
引用select a.a1 a.a2 from A a inner join B b on b.aid=a.id where b.b1='bn1'

select a.a1,a.a2 from A a ,B b where b.aid=a.id and b.b1='bn1'

一样!MYSQL会进行优化,这样 from A a inner……

------解决方案--------------------
探讨
引用:
引用select a.a1 a.a2 from A a inner join B b on b.aid=a.id where b.b1='bn1'

select a.a1,a.a2 from A a ,B b where b.aid=a.id and b.b1='bn1'

一样!MYSQL会进行优化,这样 from A a inner ……

------解决方案--------------------
引用那其他数据库呢?比如,sqlserver、oracle等,会进行优化吗?

------解决方案--------------------
探讨

那在数据量很大的情况下呢,比如几十万条数据或更多呢?

------解决方案--------------------
引用那在数据量很大的情况下呢,比如几十万条数据或更多呢?

------解决方案--------------------
如果想详细了解数据库SELECT语句优化,建议参考MYSQL官方免费手册中如下。 虽然是MYSQL的但基本上其它数据库也是同样的优化原则。
引用7.2.4. MySQL怎样优化WHERE子句
该节讨论为处理WHERE子句而进行的优化。例子中使用了SELECT语句,但相同的优化也适用DELETE和UPDATE语句中的WHERE子句。

请注意对MySQL优化器的工作在不断进行中,因此该节并不完善。MySQL执行了大量的优化,本文中所列的并不详尽。

下面列出了MySQL执行的部分优化:

· 去除不必要的括号:

· ((a AND b) AND c OR (((a AND b) AND (c AND d))))
· -> (a AND b AND c) OR (a AND b AND c AND d)
· 常量重叠:

· (a<b AND b=c) AND a=5
· -> b>5 AND b=c AND a=5
· 去除常量条件(由于常量重叠需要):

· (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
· -> B=5 OR B=6
· 索引使用的常数表达式仅计算一次。

对于MyISAM和HEAP表,在一个单个表上的没有一个WHERE的COUNT(*)直接从表中检索信息。当仅使用一个表时,对NOT NULL表达式也这样做。
无效常数表达式的早期检测。MySQL快速检测某些SELECT语句是不可能的并且不返回行。
如果不使用GROUP BY或分组函数(COUNT()、MIN()……),HAVING与WHERE合并。
对于联接内的每个表,构造一个更简单的WHERE以便更快地对表进行WHERE计算并且也尽快跳过记录。
所有常数的表在查询中比其它表先读出。常数表为:
空表或只有1行的表。
与在一个PRIMARY KEY或UNIQUE索引的WHERE子句一起使用的表,这里所有的索引部分使用常数表达式并且索引部分被定义为NOT NULL。