急!请教个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。