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
'programing' 카테고리의 다른 글
Larabel 3/4에서 쿼리 실행 (0) | 2022.10.04 |
---|---|
MySQL Error 1093 - FROM 절에서 업데이트할 대상 테이블을 지정할 수 없습니다. (0) | 2022.10.04 |
Java 응용 프로그램을 Pacebooker를 사용하여 MariaDB 서버에 연결 (0) | 2022.10.04 |
정적 변수는 스레드 간에 공유됩니까? (0) | 2022.10.04 |
PHP의 cURL을 사용한 RAW POST (0) | 2022.09.28 |