A, B 및 C와 같이 3 innodb
테이블이 있습니다.이 세 테이블을 조인하여 결과를 생성하는 쿼리가 있습니다. , 그러나MySQL : ANALYZE TABLE에 대한 임의의 결과
- C -
B :
내가 사용 명령을 'EXPLAIN'쿼리를 테스트했다 태초에SELECT A.a, B.b, C.c from A join B on A.id = B.a_id join C on C.id = B.c_id where A.a = 'example' and B.b < 10;
, 그것은 나에게 다음과 같은 순서를 제공합니다 이것은 최적이 아닙니다. 그래서 모든 테이블에 '표를 분석'실행하고 그것은 나를 제공 :
A - B를 - 나는 그것이 올바른 순서하다고 생각하는 C
.
그런 다음 SQL을 프로덕션에 배치 했으므로 아무 이유없이 1 달 후에 실행 계획이 B-C-A 인 잘못된 옵션으로 다시 전환되었습니다. 그 후, 나는 을 다시 실행하려고 시도했는데,에 대해 번을 다시 시도했지만, 이번에는 결과가 혼란 스럽다. 때로는 저에게 B - C - A를 줄 때가 있습니다. 때로는 A - B - C와 때로는 다른 실행 계획을 제공합니다.
그래서 제 질문은 :
- 왜 배포 후 실행 계획 변경?
- (데이터가 업데이트되고 빠르게 변경되므로 향후 최적의 계획이 변경 될 수 있음) 이외에도 최적의 계획이 항상 보장된다는 보장이 있습니까?
구체적인 설명에 감사드립니다. innoDB가 수시로 통계를 갱신하고, 데이터베이스 테이블이 높은 빈도 (50 초)로 업데이트/삽입되었다는 것을 고려하면, 일단 그것이 '첨단'으로 떨어지면 쉽게 되돌아 오지 않는다는 것을 알았다. . "ANALYZE TABLE"을 명시 적으로 실행해야합니다. 어떻게 그럴 수 있습니까? –
통계는 ANALYZE TABLE 또는 SHOW TABLE STATUS 또는 INFORMATION_SCHEMA.TABLES에 대한 질의 후 업데이트됩니다. 따라서 매 1 시간마다 또는 10 분마다 또는 원하는 모든 일정에 대해 이러한 진술 중 하나를 사용할 수 있습니다. 통계 업데이트의 영향은 매우 적지 만 * 모든 * 업데이트 후에는 그렇게하지 않을 정도로 충분히 큽니다. –