mysql连接速度慢,但哪里快

mysql连接速度慢,但哪里快,mysql,performance,join,Mysql,Performance,Join,我在MySQL数据库中有两个表。“results”表大约有600万行,包含3个内容:一个值、一个ID和另一个表中结果名的ID。“结果名称”表包含大约2000行。基本上,resultnames包含描述大表中结果的长字符串 因此,当我想进行查询时,我只是将两个表连接起来,以便知道每个结果的名称 当我尝试加入表时,问题就出现了。如果我像这样执行联接或子查询,则联接或子查询的速度很慢,大约需要相同的时间: mysql> select count(analysisresults_id) from a

我在MySQL数据库中有两个表。“results”表大约有600万行,包含3个内容:一个值、一个ID和另一个表中结果名的ID。“结果名称”表包含大约2000行。基本上,resultnames包含描述大表中结果的长字符串

因此,当我想进行查询时,我只是将两个表连接起来,以便知道每个结果的名称

当我尝试加入表时,问题就出现了。如果我像这样执行联接或子查询,则联接或子查询的速度很慢,大约需要相同的时间:

mysql> select count(analysisresults_id) from analysis_results where result_nameid in (select resultname_id from analysis_resultnames where result_name like '%amygdala%');
+---------------------------+
| count(analysisresults_id) |
+---------------------------+
|                      6436 |
+---------------------------+
1 row in set (18.49 sec)
。。。但是如果我单独执行子查询,速度会稍微快一些:


为什么查询时间会有如此大的差异?为什么子查询被视为常规联接?

字符串匹配代价高昂:

%amygdala%

必须完全地搜索每个值,我的意思是它可以在匹配上短路,但不能在任何不匹配上短路

为什么不先执行子查询并允许使用ID键?因为这是一个好主意


即使子查询实际上似乎并不依赖于外部查询,MySQL也会像对待它一样对待它。有多种解决方案,对您来说最简单的可能就是提前获取ID,因为您已经这样做了。您似乎也可以使用与子查询相同的WHERE子句。

MySQL有时在子查询中的优化工作做得很差。请尝试以下方法:

where exists (select 1
              from analysis_resultnames ar2
              where result_name like '%amygdala%' and
                    ar2.resultname_id = analysis_resultnames = resultname_id
             )
MySQL非常清楚,不相关的子查询只计算一次。这意味着您的原始公式将进行全表扫描-这相当昂贵。这个公式应该使用索引来获得几千个匹配行。在这个子集上,附加的like约束应该很快就会生效


关于子查询和连接的问题。您将数据库操作join与关键字join混淆。在SQL中,有几种表示联接的方法。有些在from子句中使用join这样的关键字。有些在where和select甚至having子句中使用子查询。

问题是什么?硬编码的值更快。一个很大的惊喜是一个缓慢的比较。您可以通过在result_name上建立索引来抵消这种缓慢,但速度不如直接引用ids快。我同意,LIKE的速度很慢,但它只搜索了大约2000行,而查询本身的运行速度是0.01sec@GregB,上面显示的耗时0.01秒的查询不包含LIKE语句。您能否显示此查询从分析结果名称(如“%amygdala%”)中选择结果名称(如id)需要多长时间?Hi@Lucas,请从分析结果名称(如“%amygdala%”)中选择结果名称(如id)需要0.01秒,因此总数应为0.02。仍然不到18秒:第二个查询仍然依赖于字符串匹配。他首先进行字符串匹配以获取ID。他的问题是,为什么一个貌似相当的东西要花这么长时间。@ExplosionPills,我明白你的意思,但不要那样读OP。示例代码仅显示了使用ID时查询所需的时间。它不显示运行两个单独查询的组合时间。他的问题是为什么一个比另一个花的时间长。你应该给clarifywow留言,很好。我对这种行为感到惊讶。我很确定甲骨文不是这样工作的。如果是这样的话,那么这就是两种关系型数据库之间的另一个巨大区别。谢谢链接。有没有一种方法可以使它成为不使用存储过程的非依赖查询?@GregB我不知道。。这就是MySQL的工作方式。我的第二段有一些可能的选择。使用单一查询并不总是我找到更多信息的最佳方式。在MySQL 5.x系列中,它被认为是一个bug,但它似乎没有被修复:@GregB-well,太臭了;我以前也遇到过同样的问题。希望他们能在某个时候修复它
where exists (select 1
              from analysis_resultnames ar2
              where result_name like '%amygdala%' and
                    ar2.resultname_id = analysis_resultnames = resultname_id
             )