-
MySQL. 'Select tables optimized away' vs 'Using index'개발 기록 2023. 6. 30. 18:34728x90
쿼리를 짜다 보면 마지막 seq를 가져와야 되는 경우가 생긴다.
이 경우 보통 2가지 경우를 사용한다.
-- seq는 pk다. SELECT MAX(seq) FROM abc; SELECT seq FROM abc ORDER BY seq DESC LIMIT 1;
seq가 pk 이기 때문에 둘다 빠르다.
하지만 개발자라면 무엇이 더 빠를지 고민이 생길 것이다.
그래서 explain을 사용해본다.
EXPLAIN SELECT MAX(seq) FROM abc; -- => Extra: Select tables optimized away EXPLAIN SELECT seq FROM abc ORDER BY seq DESC LIMIT 1; -- => Extra: Using index
그러면 Extra의 설명에 위와 같은 메세지가 나온다.
이제 궁금한 것은 'Select tables optimized away' 의 의미이다.
Select tables optimized away (JSON property: message)
The optimizer determined 1) that at most one row should be returned, and 2) that to produce this row, a deterministic set of rows must be read. When the rows to be read can be read during the optimization phase (for example, by reading index rows), there is no need to read any tables during query execution.
The first condition is fulfilled when the query is implicitly grouped (contains an aggregate function but no GROUP BY clause). The second condition is fulfilled when one row lookup is performed per index used. The number of indexes read determines the number of rows to read.mysql(8.0) 문서에 적힌 내용이다. (버전은 다르지만 같은 의미로 사용했을 것이다.)
여기서 가장 중요한 문장은 이것으로 보인다.
there is no need to read any tables during query execution.
쿼리 실행에 테이블을 읽을 필요가 없다!
결론.
Select tables optimized away vs Using index
1. 속도는 둘다 빠르다.
2. 하지만 테이블을 읽지도 않는 것이 더 빠르지 않을까?
- Select tables optimized away
그래서 개인적으론 이 쿼리을 사용하겠다.
SELECT MAX(seq) FROM abc;
추가.
SELECT COUNT(seq) FROM abc;
- count 함수는 테이블의 정확한 행수를 세기 때문에 느리다.
- 정확한 행의 수가 필요할 때 사용하자.
----- 참고------
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain_extra
728x90반응형'개발 기록' 카테고리의 다른 글
Spring Boot. GoogleIdTokenVerifier's parameters(HttpTransport, JsonFactory) : How to know that? (0) 2023.08.10 Spring Boot. @PathVariable with a dot(.) gets truncated (0) 2023.07.03 MyBatis. BindingException: parameter '~~' not found (0) 2023.05.31 MongoDB. upsert multi (0) 2023.05.18 MySQL. random string(alphabet + number) (0) 2023.05.10