programing

MySQL 대 대 대 대 대 대 대 대 대 대 대다수

iphone6s 2023. 9. 9. 09:08
반응형

MySQL 대 대 대 대 대 대 대 대 대 대 대다수

저는 다대다 관계에 있는 결합란이 있는 테이블이 두 개 있습니다.각 테이블에는 몇 십만 개의 레코드가 있습니다.쿼리 성능이 매우 느리고 문제를 파악하는 데 어려움을 겪고 있습니다.

표_A:

+---------------------------+-------------+---------------+
| ID | Name varchar (30)    | Age int(3)  | Status int(1) |
+----+----------------------+-------------+---------------+
| 1  | Tom                  | 23          | 1             |
| 2  | Jerry                | 34          | 2             |
| 3  | Smith                | 21          | 1             |
| 4  | Ben                  | 46          | 5             |
+---------------------------+-------------+---------------+

표_B:

+---------------------------+-------------+---------------+
| ID | Name varchar (30)    | Sign int(3) | Status int(1) |
+----+----------------------+-------------+---------------+
| 1  | Tom                  | 12          | 1             |
| 2  | Smith                | 8           | 1             |
| 3  | Tom                  | 3           | 0             |
| 4  | Tom                  | 10          | 1             |
+---------------------------+-------------+---------------+

나는 이름과 상태(표 B)가 일치하는 표 B에 행이 하나 이상 있는 표 A의 각 이름의 나이를 얻어야 합니다.

노력했습니다.

SELECT Age FROM Table_A
LEFT JOIN Table_B ON Table_A.Name=Table_B.Name
WHERE Table_B.Status=1;

그 쿼리는 너무 오래 걸려서 다시 돌아오기를 기다리지 못했습니다.그런 다음 시도했습니다.

SELECT DISTINCT Age FROM Table_A
LEFT JOIN Table_B ON Table_A.Name=Table_B.Name AND Table_B.Status=1;

아주 빨리 돌아왔네요.테스트를 더 해보고 다음과 같이 해봤습니다.

SELECT DISTINCT Age FROM Table_A
LEFT JOIN Table_B ON Table_A.Name=Table_B.Name
WHERE Table_B.Status=1;

그것도 다시 돌아오지 않았습니다.

여기서 무슨 일이 일어나고 있는지 헷갈리네요.

마지막 쿼리에서 WHERE 조건이 이전 쿼리의 JOIN ON 조건(Status=1)과 동일하게 작용해야 하지 않습니까?

SELECT는 DISCENT를 사용하지 않고도 프로세스에 시간이 오래 걸리는 이유는 무엇입니까?

다대다 표의 경우 다음 표를 포함하지 않습니다.AUTO_INCREMENT. 가지세요.PRIMARY KEY다른 ID를 모두 포함합니다.다른 인덱스가 있습니다.InnoDB를 사용합니다.

자세한 내용 및 근거참조하십시오.

설명 계획(또는 MySQL 등가물이 무엇이든)을 보지 않고서는 확실하게 말할 수 없습니다.

내 추측으로는 서버가 당신의 인터넷 주소를OUTER JOIN' to table B is completely irrelevant when you useSELECT DISTINCT, so it just runs against table A and gets the Age values from there without even performing the합류하다. Do you see why the'OUTER JOIN'은 상관없는 건가요?

첫번째 쿼리에서 서버는 다음 작업을 수행해야 합니다.JOIN정확한 숫자의 행을 되찾기 위해서입니다.

추가 논리를 추가할 때WHERE마지막 질의에서 당신은 그것을 효과적으로 다음과 같이 바꿨습니다.INNER JOIN, 그래서 지금은JOIN다시 발생해야 하고 시간이 오래 걸립니다.

Table_A에 인덱스가 설정되어 있는지 확인합니다.이름, 표_B.이름 및 표_B.상태열

첫째로, 당신은 그들이 필요로 인해LEFT JOIN, 성냥에만 관심이 있기 때문입니다.

SELECT a.Age
FROM Table_A a JOIN 
     Table_B b
     ON Table_A.Name = b.Name
WHERE b.Status = 1;

이 쿼리는 다음의 색인을 활용할 수 있습니다.Table_B(status, name)그리고.Table_A(Name, Age).

언급URL : https://stackoverflow.com/questions/36754405/mysql-many-to-many-table-join-slow-performance

반응형