繁体   English   中英

MySQL连接查询非常慢

[英]MySQL Join Query is very Slow

我有一个正在执行的MySQL联接查询,但从未完成:

SELECT t1.`id` FROM `person` as t1 
      JOIN `temp_table` as t2 
      on t1.`date` = t2.`date` 
      and t1.`name` = t2.`name` 
      and t1.`country_id`= t2.`country_id`

人员表和temp_table具有完全相同的列。

当我运行带有explain的查询时,我看到以下结果:

1   SIMPLE  t1  index   test    test    777 NULL    99560   Using where; Using index
1   SIMPLE  t2  ref test    test    777 development.t1.date,development.t1.name,development.t1.country_id   1   Using index

我使用以下语句为两个表创建了索引:

ALTER TABLE `person` ADD INDEX `test` (`date`,`name`,`country_id`)
ALTER TABLE `temp_table` ADD INDEX `test` (`date`,`name`,`country_id`)

每个表中有相同的100,000行左右,因此联接应返回100,000行。 我假设此查询是如此缓慢,因为在t1表上正在扫描的行数。 我不确定为什么要应用索引,为什么会这样。 任何帮助,将不胜感激。

具有相同的列不能保证1-1匹配,除非列的组合是唯一的。

尝试运行此查询:

select cnt, count(*)
from (select date,name, country_id, count(*) as cnt
      from person
      group by date,name, country_id
     ) t
group by cnt;

这将给出每个组合的计数。 如果您仅从其中得到一行,并且在cnt列中带有“ 1”,则您的查询应该可以。 如果获得其他值,则实际上是在乘以行数,这会导致性能问题。

编辑:

您的输出似乎是:

2564    37
2565    1
2566    1

这意味着三列的37种组合发生了2,564次。 只是这些在结果集中产生了2,564 * 2,564 * 37行(243,241,552行)。 这行很多,并且可能解释了为什么查询速度慢。

连接使元组的数量成倍增加。 尝试改为使用自然联接或by。

SELECT t1.`id` FROM `person` as t1 
 NATURAL JOIN `temp_table` as t2

我不知道mysql,但是应该可以在psql中使用,应该类似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM