mysql加入并选择速度差

时间:2011-04-14 09:26:31

标签: mysql select join performance

我要查询SQL查询

SELECT child.name,(COUNT(parent.name) - (parentDepth.depth + 1)) AS depth 
from category as child,category as parent,category as sub_parent,
( select child.name,(count(parent.name)-1) as depth from category as child,category as parent where child.lft between parent.lft and parent.rgt and child.name='ELECTRONICS' ) as parentDepth 
where child.lft between parent.lft and parent.rgt and child.lft between sub_parent.lft and sub_parent.rgt and sub_parent.name=parentDepth.name 
group by child.name having depth >0 order by child.lft

USE JOIN

SELECT child.name,(COUNT(parent.name) - (parentDepth.depth + 1)) AS depth from 
category as child join category as parent on child.lft between parent.lft and parent.rgt join category as sub_parent on child.lft between sub_parent.lft and sub_parent.rgt,
( select child.name,(count(parent.name)-1) as depth from category as child,category as parent where child.lft between parent.lft and parent.rgt and child.name='ELECTRONICS' ) as parentDepth 
where sub_parent.name=parentDepth.name 
group by child.name having depth >0 order by child.lft

我想知道一个更好!我的意思是性能和速度

3 个答案:

答案 0 :(得分:1)

如果存在差异,性能差异将是绝对最小的。基本上,, - 语法只不过是编写连接的简短形式,因此唯一的区别是用于“解析”语句的时间。要在数据库上获得更好的性能,还有很多重要的事情要做,比如

  • 使用索引
  • 不要选择未使用的字段
  • 根据您的需求选择最佳存储引擎
个人而言,我会使用第二种语法,因为它对我来说更具可读性(可读代码很重要 - 比这些微小的性能差异更重要) - 但这只是我的主观意见,其他人可能喜欢第一种语法,因为它是较短...

答案 1 :(得分:0)

在查询之前使用EXPLAIN来获取有关MySQL将如何执行查询,将使用哪些表,将读取多少行,利用哪些索引等信息......

其他解决方案是多次运行此查询(假设为100)并测量平均响应时间。

查看你的问题让我觉得你可能会写得更好(但不确定 - 乍一看太复杂了。)

答案 2 :(得分:0)

我更喜欢实际测试和获取数据而不是猜测(即使一个人的推理似乎合理)。

在单个查询级别,可以使用SHOW PROFILE语句显示在当前会话过程中执行的语句的分析信息:

http://dev.mysql.com/doc/refman/5.1/en/show-profiles.html

这将让您了解查询在MySQL数据库上运行的时间(即查询的持续时间或速度)。当然,在应用程序级别上,可能还有其他问题。

关于如何优化MySQL的一般概述,一本值得一看的有趣的书是Baron Schwartz等人的“高性能MySQL”,由O'Reilly Media,Inc。出版(ISBN:9780596101718){ {3}}
本书详细介绍了如何解释EXPLAIN语句的输出,以及许多其他有用的主题。