programing

쿼리 효율성을 분석할 때 설명 명령에 의존해야 합니까?

i4 2023. 6. 5. 23:37
반응형

쿼리 효율성을 분석할 때 설명 명령에 의존해야 합니까?

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에서 인덱스된 화합물입니다.

  1. 거리에서 설명하다지구_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>

  1. 하우스와 함께 설명합니다. 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

반응형