[英]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.