programing

SQL - SELECT의 이상한 문제

randomtip 2023. 2. 4. 08:32
반응형

SQL - SELECT의 이상한 문제

열별 단순 선택으로 이상한 상황이 발생했습니다.pqth_scan_code다음 표에 기재되어 있습니다.

테이블 pqth_

Field           Type         Null   Key     Default     Extra   
pqth_id         int(11)      NO     PRI     NULL        auto_increment
pqth_scan_code  varchar(250) NO             NULL    
pqth_info       text         YES            NULL    
pqth_opk        int(11)      NO             999

쿼리 1

이 쿼리를 실행하는 데 12.7221초가 걸렸습니다.

SELECT * FROM `pqth_` WHERE pqth_scan_code = "7900722!30@3#6$EN" 

query 2 이 쿼리를 실행하는 데 0.0003초가 걸렸습니다.

SELECT * FROM `pqth` WHERE `pqth_id`=27597 

표의 데이터를 기반으로 합니다.pqth_다음 표를 작성했습니다.pqthc_id=pqth_id그리고.pqthc_scan_code=pqth_scan_code

테이블 pqthc

Field           Type         Null   Key     Default     Extra   
pqthc_id        int(11)      NO     PRI     NULL    
pqthc_scan_code tinytext     NO             NULL    

테이블상의 같은 쿼리 query1pqthc실행하는 데 0.0259초가 소요되었습니다.

SELECT * FROM `pqthc` WHERE pqthc_scan_code = "7900722!30@3#6$EN"

다음 쿼리를 실행하면 0.0971초가 소요됩니다.매우 이상합니다.

쿼리 3

SELECT * FROM `pqth` WHERE pqth_id = (SELECT pqthc_id From pqthc where pqthc_scan_code = "7900722!30@3#6$EN")

질문은 SELECT by가 느리고 SELECT by가 가장 빠른 이유는 무엇입니까?두 열 모두 인덱싱됩니다.

테스트를 위해 이 링크에서 내보내기를 가져오십시오.

MySQL 및 MariaDB 서버에서도 같은 동작이 발생합니다.

SELECT * FROM `pqth_` WHERE pqth_scan_code = "7900722!30@3#6$EN" 

필요.INDEX(pqth_scan_code). 마침표.더 이상 왈가왈부하지 마.

SELECT * FROM `pqth` WHERE `pqth_id`=27597 

유용한 인덱스를 가지고 있습니다.PRIMARY KEY는 인덱스입니다(또한 고유합니다).

SELECT * FROM `pqthc` WHERE pqthc_scan_code = "7900722!30@3#6$EN"

필요성도 있다INDEX(pqthc_scan_code)그러나 (1) 테이블이 작거나 (2) 이전에 쿼리를 실행하여 RAM에 필요한 것을 캐싱했기 때문에 더 빠를 수 있습니다.

열 이름 앞에 테이블 이름을 붙이지 마십시오.
테이블 이름은 구별하기 어려울 정도로 가까이 두지 말아 주세요.(pqth그리고.pqthc)

SELECT  *
    FROM  `pqth`
    WHERE  pqth_id = 
      ( SELECT  pqthc_id
            From  pqthc
            where  pqthc_scan_code = "7900722!30@3#6$EN"
      )

구성IN ( SELECT ... )효율적이지 않습니다.

같은 테이블이 두 개 있는 경우는 드물다.PRIMARY KEY진심이야?

를 사용하다JOIN대신:

SELECT  a.*
    FROM  `pqth` AS a
    JOIN  pqthc AS c ON a.id = c.id
    where  c.scan_code = "7900722!30@3#6$EN" 

그것이 '올바른' 경우 다음 '커버링' 인덱스를 권장합니다.

INDEX(scan_code, id)

단축형 대신INDEX(scan_code)아까 추천해 드렸는데요.

색인에 대한 자세한 정보

프라이머리 키와 인덱스의 개념과 그것들이 어떻게 검색에 도움이 되는지 이해할 필요가 있습니다.여기서 참조 문서를 참조해 주세요.

일단은pqthc_scan_code인덱스/키가 없습니다.pqthc_id키를 사용하면 검색 속도를 높일 수 있습니다.

또 다른 차이점은pqthc_id는 정수입니다.pqthc_scan_code문자열입니다. 정수를 비교하는 것이 문자열을 비교하는 것보다 훨씬 효율적입니다.

매우 큰 테이블에서 문자열을 검색할 필요가 없습니다.

인덱스/키를 추가할 수 있습니다.pqthc_scan_code그게 얼마나 도움이 될지 모르겠어요

쿼리 앞에 EXPLY를 사용하여 시간이 걸리는 이유를 확인할 수 있습니다.자세한 내용은

언급URL : https://stackoverflow.com/questions/36641350/sql-strange-issue-with-select

반응형