programing

MySQL 오더로 인해 쿼리가 느리게 해결되지만 이유는 확실하지 않습니다.

itsource 2022. 10. 4. 21:56
반응형

MySQL 오더로 인해 쿼리가 느리게 해결되지만 이유는 확실하지 않습니다.

다음 질문이 있습니다.

select *
from 
  `twitter_posts` 
where 
  `main_handle_id` in (
    select 
      `twitter`.`main_handle_id` 
    from 
      `users` 
      inner join `twitter` on `twitter`.`user_id` = `user`.`id` 
    where 
      `users` LIKE 'foo'
  ) 
order by created_at

by 순서를 사용하면 이 쿼리는 매우 느리게 실행됩니다.twitter_posts테이블에는 인덱스가 있습니다.created_at타임스탬프와main_handle_id기둥.

엔진이 뭘 하려는지 알기 위해 "설명"을 사용했는데 파일 정렬이...인덱스가 존재하기 때문에 예상하지 못했던 것입니다.twitter_posts표. Stackoverflow와 블로그에서 이를 다루는 다양한 게시물을 훑어본 결과, 나에게 효과가 있는 예는 하나도 없었다.SQL 옵티마이저가 네스트된 선택과 혼동한 것 같아요그래서 나는 질의를 포장하고 그 결과를 주문했다.created_at:

select * (select *
from 
  `twitter_posts` 
where 
  `main_handle_id` in (
    select 
      `twitter`.`main_handle_id` 
    from 
      `users` 
      inner join `twitter` on `twitter`.`user_id` = `user`.`id` 
    where 
      `users` LIKE 'foo'
  ) 
)
order by created_at

이에 대한 설명을 사용하여 인덱스를 사용하여 파일 정렬에 필요한 응답의 극히 일부만 정렬하고 반환합니다.문제는 해결했지만 SQL이 솔루션을 기반으로 다른 선택을 하는 이유를 이해할 수 없습니다.제가 볼 수 있는 한, 저는 결과를 포장하고 모든 결과를 겉으로 보기에 불필요한 진술로 묻고 있습니다.

편집: 옵티마이저가 용장 서브쿼리를 사용할 때 created_at의 인덱스를 사용하기 시작한 이유는 아직 알 수 없지만, 일부 경우에는 속도가 빠르지 않았습니다.이제 솔루션에서 "FORCE INDEX FOR ORDER BY created_at_index_name"이라는 문구를 추가했습니다.

사용하지 않다IN ( SELECT ... ); 그것을 로 변환한다.JOIN또는 로 변환하는 경우도 있습니다.EXISTS ( SELECT ... )최적화할 수 있습니다.

다음 정보를 제공하십시오.EXPLAINs똑같아도.제공하다EXPLAIN FORMAT=JSON SELECT ...를 참조해 주세요.

중첩된 쿼리로 인해 Optimizer가 혼란스러우면 다른 중첩을 추가하는 이유는 무엇입니까?

어느 테이블이users어디서?

말씀하신 대로user.id그러나 없다.user을 포함하다FROM또는JOIN.

어떤 버전의 MySQL(또는 MariaDB)을 사용하고 있습니까? 5.6, 특히 5.7은 MariaDB와 관련하여 최적화 도구에 큰 차이가 있습니다.

제공해주세요SHOW CREATE TABLE쿼리에서 언급된 각 테이블에 대해 설명합니다.

당신의 코멘트에는 당신이 제시한 질문이 당신에게 문제를 일으키는 것이 아니라는 힌트가 있습니다.문제 자체를 증명하지 않는 문의는 하지 말아 주세요.

아, 그래요?users.name? 를 참조할 경우CREATE TABLEs적절한 인덱스가 있는지 확인합니다.

MariaDB가 언급되었으므로 이 태그를 추가합니다(MariaDB 전문 지식을 가진 사람을 참여시킬 수 있는 유일한 방법일 것입니다).

언급URL : https://stackoverflow.com/questions/47993482/mysql-order-by-makes-query-slow-solved-but-not-sure-why

반응형