쿼리 효율성을 분석할 때 설명 명령에 의존해야 합니까?
explain SELECT * FROM house JOIN street s on house.STREET_ID = s.ID WHERE s.type<>'out_of' AND street.DISTRICT_ID=4 ORDER BY house.num;
explain SELECT * FROM house JOIN street s on house.STREET_ID = s.ID WHERE s.type<>'out_of' AND house.DISTRICT_ID=4 ORDER BY house.num;
type 및 district_id는 Street table district_id가 House table에서 인덱스된 화합물입니다.
- 거리에서 설명하다지구_ID=4, 스트리트 테이블이 결합되었습니다.
<data>
<row>
<id>1</id>
<select_type>SIMPLE</select_type>
<table>street</table>
<type>ref</type>
<possible_keys>PRIMARY,FK_STREET_DISTRICT,IDX_STREET_DISTRICT_ID_STREET_TYPE</possible_keys>
<key>IDX_STREET_DISTRICT_ID_STREET_TYPE</key>
<key_len>8</key_len>
<ref>const</ref>
<rows>16</rows>
<Extra>Using index condition; Using temporary; Using filesort</Extra>
</row>
<row>
<id>1</id>
<select_type>SIMPLE</select_type>
<table>house</table>
<type>ref</type>
<possible_keys>FK_HO_ST,idx_or_st_entity</possible_keys>
<key>FK_HO_ST</key>
<key_len>8</key_len>
<ref>street.ID</ref>
<rows>70695</rows>
<Extra></Extra>
</row>
</data>
- 하우스와 함께 설명합니다. DIRECT_ID=4
<data>
<row>
<id>1</id>
<select_type>SIMPLE</select_type>
<table>house</table>
<type>ALL</type>
<possible_keys>FK_ST_HO,FK_ST_DISTRICT,idx_or_st_entity,IDX_HO_DISTRICT_NUM</possible_keys>
<key>null</key>
<key_len>null</key_len>
<ref>null</ref>
<rows>989734</rows>
<Extra>Using where; Using filesort</Extra>
</row>
<row>
<id>1</id>
<select_type>SIMPLE</select_type>
<table>street</table>
<type>eq_ref</type>
<possible_keys>PRIMARY</possible_keys>
<key>PRIMARY</key>
<key_len>8</key_len>
<ref>house.STREET_ID</ref>
<rows>1</rows>
<Extra>Using where</Extra>
</row>
</data>
지구_ID는 집과 거리는 동일하지만 수신된 예상 행 수는 큰 차이가 있습니다.가입된 DIRECT_ID를 사용하는 쿼리가 더 효율적이라는 뜻입니까? 여기서 예상 행은 = 70695입니까?
첫 번째 쿼리는 실제로 1,131,120개의 행을 조사하는 것입니다.JOIN 쿼리의 경우 제품을 확인해야 합니다.rows
연결된 테이블 사이의 필드입니다.당신의 경우, 그것은 16개 행을 조사할 것으로 추정합니다.street
각 행에 대해 결합된 표의 70,695개 행을 검사할 것으로 추정합니다.house
. 16*70695 = 1131120.
두 번째 표는 989,734개의 행을 조사할 것으로 추정합니다.house
(테이블 스캔으로, 다음과 같이 표시됨)type: ALL
) 및 각 일치하는 행에 대해 결합된 테이블에서 하나의 행을 검색합니다.street
기본 키(에 의해 표시됨)type: eq_ref
).
그 숫자들을 대충 계산해 보세요.그것들은 단지 추정치일 뿐이며, 상당한 차이가 날 수 있습니다.정확한 숫자가 아닌 크기의 순서로 보는 것이 좋습니다.쿼리의 최종 결과에 수십만 행이 있을 것으로 예상하지 않는 한 두 가지 모두 비효율적이라고 생각합니다.
테이블을 보지 않고는 더 나은 인덱스 전략을 추측하기가 어렵습니다.일반적으로 쿼리 최적화에 대한 질문에는 dbfidle에 대한 링크 또는 출력이 포함되어야 합니다.SHOW CREATE TABLE
쿼리의 각 테이블에 대해 입력합니다.
당신의 질문으로 미루어 짐작하건대 두 테이블은 모두DISTRICT_ID
기둥.중복된 것입니까, 아니면 조인 조건을 개선하는 데 사용할 수 있습니까?예:
...
FROM house h JOIN street s
ON h.STREET_ID = s.ID AND h.DISTRICT_ID = s.DISTRICT_ID
...
제가 생각하는 것은 이것을 사용하여 조사된 행의 수를 좁힐 수 있다면 인덱스에 추가할 가치가 있을 것입니다.하지만 당신이 이 표들에 대해 제공한 제한된 정보를 고려할 때 저는 그것을 알 수 없습니다.
언급URL : https://stackoverflow.com/questions/71696735/should-rely-on-explain-command-when-analyzing-query-efficiency
'programing' 카테고리의 다른 글
루비에 증분 연산자(+)가 없습니까? (0) | 2023.06.05 |
---|---|
잘못된 번들 오류 - "실행 스토리보드 필요" (0) | 2023.06.05 |
Python과 교차 플랫폼 방식으로 경로가 절대 경로인지 상대 경로인지 확인하는 방법은 무엇입니까? (0) | 2023.06.05 |
항목에 대한 상위 항목 검색 중 오류 발생:AppCompat v23으로 업그레이드한 후 지정된 이름과 일치하는 리소스를 찾을 수 없음 (0) | 2023.06.05 |
ID가 추가되기 전에 ID를 얻을 수 있습니까? (0) | 2023.06.05 |