【发布时间】:2013-02-11 00:27:10
【问题描述】:
我在 MySQL 数据库中有 2 个表。 “结果”表有大约 600 万行,包含 3 个内容:值、ID 和不同表中结果名称的 ID。 “结果名称”表包含大约 2000 行。基本上,结果名称包含描述大表中结果的长字符串。
所以,当我想进行查询时,我只是将两个表连接起来,这样我就知道每个结果的名称是什么。
当我尝试加入表格时,问题就来了。如果我像这样进行连接或子查询,它会很慢(连接或子查询大约需要相同的时间):
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)
...但如果我单独执行子查询,它会稍微快一点:
mysql> select count(analysisresults_id) from analysis_results where result_nameid in (13,28);
+---------------------------+
| count(analysisresults_id) |
+---------------------------+
| 6436 |
+---------------------------+
1 row in set (0.01 sec)
为什么查询时间差异如此之大?为什么子查询被视为常规连接?
【问题讨论】:
-
问题是什么?硬编码值更快。一个大惊喜。
-
LIKE比较慢。您可以通过在result_name上建立索引来消除这种缓慢,但它不会像直接引用 ID 那样快 -
我同意 LIKE 很慢,但它只搜索大约 2000 行,并且单独运行该查询是 0.01 秒
-
@GregB,您在上面显示的需要 0.01 秒的查询不包括 LIKE 语句。你能显示这个查询
select resultname_id from analysis_resultnames where result_name like '%amygdala%'需要多长时间吗? -
嗨 @Lucas,
select resultname_id from analysis_resultnames where result_name like '%amygdala%'需要 0.01 秒,所以总数应该是 0.02。仍然不到 18 秒 :)
标签: mysql performance join