簡體   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