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
'programing' 카테고리의 다른 글
PHP zip 확장자를 사용한 도커 이미지 빌드에 "bundled libzip is decommended" 경고가 표시됨 (0) | 2023.02.04 |
---|---|
여러 개의 독립된 mariadb 사용: 여러 개의 컨테이너 또는 하나의 컨테이너?격리 대 효율성? (0) | 2023.02.04 |
Node.js 네이티브 Promise입니다.병렬 또는 순차적으로 모든 처리를 수행합니까? (0) | 2023.02.04 |
MariaDB 스테이트먼트의 UNION 조항을 대체하는 방법에 대한 생각 (0) | 2023.02.04 |
MySQL Workbench에서 Blob을 직접 표시하는 방법 (0) | 2023.02.04 |