커버링 인덱스 | [10분 테코톡] 👨‍🏫안돌의 Index 상위 192개 답변

당신은 주제를 찾고 있습니까 “커버링 인덱스 – [10분 테코톡] 👨‍🏫안돌의 INDEX“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 우아한Tech 이(가) 작성한 기사에는 조회수 15,819회 및 좋아요 349개 개의 좋아요가 있습니다.

커버링 인덱스 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [10분 테코톡] 👨‍🏫안돌의 INDEX – 커버링 인덱스 주제에 대한 세부정보를 참조하세요

💡 우아한테크코스의 크루들이 진행하는 10분 테코톡입니다. 💡
안돌이 데이터베이스의 Index에 대해 공유해주었는데요. 프로그래밍 공부를 본격적으로 시작하기 전, 데이터를 다룰일이 생겨 학습했던 경험이 빛을 발한 발표였습니다. 짧은 시간의 준비로는 나누기 어려운 부분을 쉽게 공유해줘서 모두 놀란 시간이었습니다 🙂
🌕우아한테크코스란 🌕
우아한테크코스는 일반 사용자용 서비스를 개발하는 회사가 필요로 하는 역량을 가진 프로그래머를 양성하기 위한 교육입니다. 우리의 목표는 자기 주도적으로 학습하고 성장하고 싶은 개발자를 위한 교육을 만드는 것입니다.
🙋‍♀️10분 테코톡이란 🙋‍♂️
우아한테크코스 과정을 진행하며 크루(수강생)들이 동료들과 학습한 내용을 공유하고 이야기하는 시간입니다. 서로가 성장하기 위해 지식을 나누고 대화하며 생각해보는 시간으로 자기 주도적인 성장을 지향하는 우아한테크코스의 문화 중 하나입니다.

커버링 인덱스 주제에 대한 자세한 내용은 여기를 참조하세요.

커버링 인덱스 – Tecoble

커버링 인덱스 는 쿼리를 충족하는데 필요한 모든 데이터를 갖는 인덱스를 뜻한다. SELECT / WHERE / GROUP BY / ORDER BY 등에 활용되는 모든 컬럼이 …

+ 여기에 자세히 보기

Source: tecoble.techcourse.co.kr

Date Published: 8/9/2021

View: 5056

1. 커버링 인덱스 (기본 지식 / WHERE / GROUP BY)

이처럼 쿼리를 충족시키는 데 필요한 모든 데이터를 갖고 있는 인덱스를 커버링 인덱스 (Covering Index 혹은 Covered Index) 라고합니다. 좀 더 쉽게 …

+ 자세한 내용은 여기를 클릭하십시오

Source: jojoldu.tistory.com

Date Published: 5/6/2021

View: 1957

[MySQL] 커버링 인덱스

커버링 인덱스는 쿼리의 조건을 충족시키는데 필요한 모든 데이터들을 인덱스에서만 추출할 수 있는 인덱스를 의미합니다. 커버링 인덱스는 B-Tree …

+ 여기에 더 보기

Source: icarus8050.tistory.com

Date Published: 10/17/2022

View: 6311

mysql 커버링 인덱스란 무엇인가? | sTricky

커버링 인덱스라는건 어떤 SQL에서 원하는 출력 데이터와 조건 데이터가 모두 인덱스에 존재 하는 경우를 이야기 합니다.

+ 여기에 더 보기

Source: stricky.tistory.com

Date Published: 11/17/2021

View: 3161

MySQL에서 커버링 인덱스로 쿼리 성능을 높여보자!!

커버링 인덱스란 원하는 데이터를 인덱스에서만 추출할 수 있는 인덱스를 의미합니다. B-Tree 스캔만으로 원하는 데이터를 가져올 수 있으며, 칼럼을 읽기 …

+ 자세한 내용은 여기를 클릭하십시오

Source: gywn.net

Date Published: 2/22/2021

View: 2779

SQL – 커버링 인덱스

커버링 인덱스(Covering Index)는 원하는 데이터를 인덱스에서만 추출할 수 있는 인덱스를 의미한다. B-Tree 스캔만으로 원하는 데이터를 가져올 수 …

+ 더 읽기

Source: jaehoney.tistory.com

Date Published: 7/9/2021

View: 3464

커버링 인덱스

커버링 인덱스란 인덱스만 이용해서 데이터를 추출할수 있는 인덱스를 의미합니다. 인덱스에서만 데이터를 추출하기 때문에 Disk I/O를 발생시키지 …

+ 여기에 자세히 보기

Source: helloino.tistory.com

Date Published: 8/29/2021

View: 81

주제와 관련된 이미지 커버링 인덱스

주제와 관련된 더 많은 사진을 참조하십시오 [10분 테코톡] 👨‍🏫안돌의 INDEX. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[10분 테코톡] 👨‍🏫안돌의 INDEX
[10분 테코톡] 👨‍🏫안돌의 INDEX

주제에 대한 기사 평가 커버링 인덱스

  • Author: 우아한Tech
  • Views: 조회수 15,819회
  • Likes: 좋아요 349개
  • Date Published: 2019. 8. 26.
  • Video Url link: https://www.youtube.com/watch?v=NkZ6r6z2pBg

커버링 인덱스

조회 성능 개선 미션을 진행하며 커버링 인덱스 를 알게 됐다. 처음 보는 단어여서 이게 어떤 인덱스일까 궁금했고, 바로 찾아보고 이해했다. 그러면서 한번 내용을 글로 정리하면 좋을 것 같다는 생각을 했다. 그래서 이번 기회에 학습 테스트를 하며 해당 개념을 잡고가려 한다.

커버링 인덱스?

*인덱스는 데이터를 효율적으로 탐색하는 방법이다. MySQL의 경우 인덱스 안에 있는 데이터를 사용할 수 있다. 이를 잘 이용하면 실 데이터까지 접근할 필요가 없다. 즉, 테이블에 액세스하지 않아도 된다.

커버링 인덱스 는 쿼리를 충족하는데 필요한 모든 데이터를 갖는 인덱스를 뜻한다. SELECT / WHERE / GROUP BY / ORDER BY 등에 활용되는 모든 컬럼이 인덱스의 구성 요소인 경우를 말한다.

커버링 인덱스를 잘 쓰면(특히, 대용량 데이터 처리 시), 조회 성능을 상당 부분 높일 수 있다.

*인덱스에 대해 기초를 쌓고 싶다면, 테코블에 있는 아래 글을 참고해보자.

기본 지식

실행 계획

쿼리의 실행 계획을 확인하는 방법은 2가지가 있다. 아래 쿼리를 이용해서 어떤 방법인지 알아보자.

SELECT * FROM programmer WHERE member_id < 10 ; Workbench 아이콘 MySQL Workbench를 사용하면, 쿼리문을 작성하는 화면 상단에서 아래와 같이 여러 아이콘을 볼 수 있다. 이중 ⚡️ + 🔍 를 클릭하면 실행 계획을 확인할 수 있다.(왼쪽에서 5번째에 위치한 아이콘이다.) ⚡️ + 🔍 를 클릭해서 확인하면, 이렇게 실행 계획이 나타난다. 해당 쿼리는 Index Range Scan을 했음을 알 수 있다. EXPLAIN 쿼리의 맨 앞에 EXPLAIN 을 붙여 실행하면, 아이콘보다 더 상세한 실행 계획을 확인할 수 있다. 이는 SQL 쿼리로 보는 방식이다. EXPLAIN SELECT * FROM programmer WHERE member_id < 10 ; SQL 쿼리로 확인하면, 아래처럼 실행 계획이 나타난다. 각 항목에 관한 내용은 바로 이어서 설명한다. id SQL문이 실행되는 순서를 의미한다. 2개 행의 id가 같다면, 이는 조인된 것이다. select_type SELECT문의 유형을 의미한다. SIMPLE: 단순한 SELECT문 PRIMARY: 외부쿼리 또는 UNION이 포함되는 경우 1번째 SELECT문 SUBQUERY: SELECT / WHERE에 작성된 서브쿼리 DERIVED: FROM에 작성된 서브쿼리 UNION: UNION 또는 UNION ALL로 합쳐진 SELECT문 type system: 0개 또는 1개의 데이터만 테이블에 존재하는 경우 const: 단 1개의 데이터만 조회하는 경우 eq_ref: 조인이 될 때, 드리븐 테이블의 PK 또는 고유 인덱스로 단 1개의 데이터만 조회하는 경우 ref: eq_ref와 같지만, 2개 이상의 데이터를 조회하는 경우 index: * Index Full Scan Index Full Scan range: * Index Range Scan Index Range Scan all: *Table Full Scan *Index Full Scan, Index Range Scan, Table Full Scan이 무엇인지 잘 모르겠다면, 아래 글을 참고해보자. key 옵티마이저가 실제로 선택한 인덱스를 의미한다. rows SQL문을 수행하기 위해 접근한 데이터의 모든 행 수를 의미한다. extra Distinct: 중복을 제거하는 경우 Using where: WHERE로 필터링한 경우 Using temporary: 데이터 중간 결과를 위해 임시 테이블을 생성한 경우 (보통 DISTINCT / GROUP BY / ORDER BY 가 포함되면 임시 테이블 생성) 가 포함되면 임시 테이블 생성) Using index: 커버링 인덱스 를 사용한 경우 를 사용한 경우 Using filesort: 데이터를 정렬한 경우 실행 계획의 extra 에 Using index 가 나타나면, 이는 커버링 인덱스를 활용한 것으로 해석할 수 있다. Non-clustered Key와 Clustered Key 대상 제한 Non-clustered Key 일반적인 인덱스 테이블에 여러 개 생성 가능 Clustered Key (1) PK (2) PK가 없을 땐, Unique Key (3) PK가 없고 Unique Key도 없을 땐, 6 bytes의 Hidden Key 생성 테이블당 1개만 생성 가능 Non-clustered Key와 Clustered Key를 통한 탐색은 다음과 같이 진행된다. 현재 age와 PK에 인덱스가 걸려있다. 따라서 Non-clustered Key는 age에, Clustered Key는 PK에 인덱스가 있다. 그리고 Non-clustered Key는 age 순으로, Clustered Key는 PK 순으로 정렬된다. Non-clustered Key에는 인덱스 컬럼(age)의 값들과 PK의 값들이 있고, Clustered Key는 테이블의 실제 레코드 위치를 알고 있다. MySQL에서는 Non-clustered Key에 Clustered Key가 항상 포함되어 있다. Non-clustered Key엔 데이터 블록의 위치가 없기 때문이다. 그러므로 인덱스 조건에 부합하는 WHERE가 있더라도, SELECT 문에 인덱스에 포함되어 있는 컬럼 외의 다른 컬럼 값이 필요할 때는 Non-clustered Key에 있는 Clustered Key 값으로 데이터 블록을 찾는 과정이 필요하다. 그렇지만, PK를 사용하는 경우에는 테이블 액세스 시간이 없어져서 필요로 하는 데이터에 더 빠르게 접근할 수 있다. 결국 커버링 인덱스 는 이미지의 2. 실제 데이터 접근 과정 없이, 인덱스에 존재하는 컬럼 값으로만 쿼리를 완성하는 것을 얘기한다. 적용 조건 학습 테스트에서는 아래의 member 테이블을 활용했다. 테이블의 컬럼은 다음과 같고, 전체 레코드는 96206개가 있다. 학습 테스트를 시작하기 앞서 (email)으로 인덱스를 추가했다. CREATE INDEX ` idx_member_email ` ON ` member ` ( email ) ; SELECT + WHERE 먼저, 아래 쿼리의 실행 계획을 확인했다. SELECT * FROM member WHERE email = '[email protected]' ; 그렇다면, SELECT 문을 * 가 아닌 email 로 변경하면 어떤 일이 일어날까? SELECT email FROM member WHERE email = '[email protected]' ; 실행 계획의 extra 를 보면, 커버링 인덱스가 사용됐다. 즉, 이 쿼리는 인덱스에 포함되어 있는 컬럼만으로 쿼리 생성이 가능하다. WHERE + GROUP BY 우선, GROUP BY는 아래 조건에서 인덱스가 적용된다. 인덱스 컬럼과 GROUP BY에 명시하는 컬럼의 순서는 동일해야 된다. 인덱스 컬럼 중 뒤에 있는 컬럼은 GROUP BY에 명시하지 않아도 된다. 인덱스 컬럼 중 앞에 있는 컬럼은 GROUP BY에 명시해야 된다. 인덱스에 없는 컬럼을 GROUP BY에 명시하면 안된다. GROUP BY b GROUP BY b , a GROUP BY a , c , b GROUP BY a GROUP BY a , b GROUP BY a , b , c GROUP BY b , c GROUP BY a , b , c , d WHERE가 동등 비교일 때 WHERE + GROUP BY가 함께 사용되면, WHERE에 있는 컬럼은 GROUP BY에 없어도 된다. WHERE a = 1 GROUP BY b , c WHERE a = 1 and b = 'dani' GROUP BY c WHERE가 동등 비교가 아닐 때 학습 테스트를 하기 앞서 (email, id, age)로 인덱스를 추가했다. CREATE INDEX ` idx_member_email_id_age ` ON ` member ` ( email , id , age ) ; 그리고 아래 쿼리의 실행 계획과 수행 시간을 확인했다. SELECT * FROM member WHERE email LIKE 'probitanima1%' GROUP BY id , age ; 실행 계획의 extra 에 Using where 가 나타났다. 이는 WHERE로 필터링한 것으로 해석할 수 있다. 수행 시간은 0.250sec 이 소요됐다. 해당 시간이 긴 건지 짧은 건지 판단하기 어려웠다. 그래서 커버링 인덱스를 사용하는 테스트를 이어 진행했다. 이번에는 아래 쿼리의 실행 계획과 수행 시간을 확인했다. SELECT email , id , age FROM member WHERE email LIKE 'probitanima1%' GROUP BY id , age ; 실행 계획의 extra 에 Using index 가 나타났다. 이는 커버링 인덱스를 이용한 것으로 해석할 수 있다. 수행 시간은 0.70sec 이 소요됐다. 이전 테스트와 비교하여 수행 시간이 약 3.5배 정도 단축됐다. 커버링 인덱스를 적용하니 결과를 상대적으로 빠르게 얻을 수 있었다. 결론 조회 쿼리를 작성할 때, 커버링 인덱스 를 적절하게 활용하면 성능 개선에 도움을 줄 수 있다. 다만, 인덱스 적용 조건을 잘 숙지해야 한다. 이번 글에서 실험한 상황 외에도 다양한 곳에서 커버링 인덱스를 사용할 수 있다. WHERE + ORDER BY와 같은 케이스에 대한 내용은 바로 아래 레퍼런스에 첨부했다. 관심이 있는 사람은 참고해서 추가로 학습하면 좋을 것 같다. References

1. 커버링 인덱스 (기본 지식 / WHERE / GROUP BY)

일반적으로 인덱스를 설계한다고하면 WHERE 절에 대한 인덱스 설계를 이야기하지만 사실 WHERE 뿐만 아니라 쿼리 전체에 대해 인덱스 설계가 필요합니다.

인덱스의 전반적인 내용은 이전 포스팅을 참고하시면 좋습니다.

인덱스는 데이터를 효율적으로 찾는 방법이지만, MySQL의 경우 인덱스안에 포함된 데이터를 사용할 수 있으므로 이를 잘 활용한다면 실제 데이터까지 접근할 필요가 전혀 없습니다.

이처럼 쿼리를 충족시키는 데 필요한 모든 데이터를 갖고 있는 인덱스를 커버링 인덱스 (Covering Index 혹은 Covered Index) 라고합니다.

좀 더 쉽게 말씀드리면 SELECT, WHERE, ORDER BY, GROUP BY 등에 사용되는 모든 컬럼이 인덱스의 구성요소인 경우를 얘기합니다.

1-1. 커버링 인덱스 기본 지식

커버링 인덱스의 예제를 보기전에 기본 지식을 먼저 익히고 넘어가겠습니다.

1-1-1. Using index

먼저, 커버링 인덱스가 적용되면 아래와 같이 EXPLAIN 결과 (실행 계획) 의 Extra 필드에 “Using index” 가 표기됩니다.

여기서 index가 표기되는 여러 항목들과 비교하면 다음과 같은 차이점이 있습니다.

표기 설명 Extra Using index 커버링 인덱스 (쿼리의 모든 항목이 인덱스 컬럼으로 이루어진 상태) Extra Using index condition 인덱스 컨디션 푸시다운 인덱스 type index 인덱스 풀 스캔 (range 스캔이 아님)

인덱스 풀 스캔이 발생하는 경우는 아래와 같습니다.

range, const, ref와 같은 접근 방식으로 인덱스를 사용하지 못하는 경우 위 조건과 더불어 아래 조건 중 하나가 동시 만족될 경우 인덱스에 포함된 컬럼만으로 처리할 수 있는 쿼리인 경우 (즉, 데이터 파일을 안읽어도 되는 경우) 인덱스를 이용해 정렬이나 그룹핑 작업이 가능한 경우 (즉, 별도의 정렬 작업을 피할 수 있는 경우)

1-1-2. Non Clustered Key와 Clustered Key

대상 제한 Clustered Key 1) PK

2) PK가 없을땐 유니크키

3) 1~2 둘다 없을 경우 6byte의 Hidden Key를 생성 (rowid) 테이블당 1개만 존재 가능 Non Clustered Key 일반적인 인덱스 여러개 생성 가능

Non Clustered Key와 Clustered Key를 통한 탐색은 다음과 같이 진행됩니다.

index-age는 age순으로 정렬되어있고, pk는 id순으로 정렬되어있습니다.

위 그림에선 2가지를 보셔야하는데요.

Non Clustered Key (일반적인 인덱스) 에는 인덱스 컬럼의 값들 과 Clustered Key (PK) 의 값 이 포함되어 있음

과 이 포함되어 있음 Clustered Key 만이 실제 테이블의 row 위치를 알고 있음

MySQL에서는 Non Clustered Key에 Clustered Key가 항상 포함되어 있습니다.

이유는 Non Clustered Key에는 데이터 블록의 위치가 없기 때문인데요.

즉, 인덱스 조건에 부합한 where 조건이 있더라도 select 에 인덱스에 포함된 컬럼 외에 다른 컬럼값이 필요할때는 Non Clustered Key에 있는 Clustered Key 값으로 데이터 블록을 찾는 과정이 필요합니다.

다만 PK를 사용할 경우 인덱스 탐색 시간이 없어지기 때문에 향상된 데이터 파일 접근이 가능하다

커버링 인덱스는 여기서 “2. 실제 데이터 접근” 의 행위 없이 인덱스에 있는 컬럼값들로만 쿼리를 완성하는 것을 이야기 합니다.

자 이 내용을 숙지 하신뒤, 다음의 예제를 확인해보겠습니다.

1-2. SELECT

테스트용 테이블의 이름은 temp_ad_offset 입니다.

해당 테이블에 대략 1300만건의 데이터를 넣고 테스트를 진행합니다.

인덱스 (customer_id 컬럼만 존재)가 있을 경우, 아래의 쿼리는 어떻게 작동될까요?

select * from temp_ad_offset where customer_id = 7;

실행 계획을 돌려보면 다음과 같습니다.

혹시나 실행 계획을 처음 보신다면 각 항목은 다음과 같습니다.

필드 값 설명 Selected_type SIMPLE UNION이나 서브쿼리가 없는 단순 Select Type ref 조인을 할때 PK 혹은 Unique Key가 아닌 Key로 매핑된 경우.

여기서는 단일 테이블이니 동등 조건으로 검색할 경우를 가리킴 key idx_temp_ad_offset_customer_id 쿼리에 사용된 인덱스 ref const 비교 조건으로 어떤 값이 사용되었는지 나타냄.

여기서는 고정된 값인 7이 사용되어서 const로 표기된다 Extra 빈값일 경우 일반적인 쿼리

실행 계획의 결과는 일반적인 인덱스가 where절에 사용된 경우로 출력 됩니다.

(key 항목에 사용된 인덱스가, Extra 항목에는 빈값)

이 경우는 where절에는 인덱스가 사용되었지만, select절의 필드를 완성하기 위해 데이터 블록 접근이 있었다를 의미합니다.

자 그럼 여기서 쿼리의 select 절을 select customer_id 로 해서 다시 해당 쿼리의 실행 계획을 확인해보겠습니다.

select customer_id from temp_ad_offset where customer_id = 7;

앞선 결과와 다르게 Extra 항목에 Using index 가 등장합니다.

이 쿼리는 인덱스에 포함된 컬럼 (customer_id) 만으로 쿼리가 생성 가능하니 커버링 인덱스가 사용 된 것입니다.

이렇게 Extra 항목에 Using index 가 나온다면 이 쿼리는 커버링 인덱스가 사용된 것으로 보시면 됩니다.

Extra 항목에 Using index 가 있어야만 인덱스를 사용한 것이 아닙니다.

인덱스 사용 유무는 key 항목에 선택된 인덱스가 있냐 없냐의 차이입니다.

Extra 항목에 Using index 가 있는 경우는 쿼리 전체가 인덱스 컬럼값으로 다 채워진 경우에만 발생합니다.

자 이제 다양한 상황을 확인해보겠습니다.

1-3. WHERE + GROUP BY

먼저 GROUP BY 에서 인덱스는 아래 조건에서 적용됩니다.

GROUP BY 절에 명시된 컬럼이 인덱스 컬럼의 순서와 같아야 한다 . 아래 모든 케이스는 인덱스가 적용 안된다 . (index: a,b,c) group by b group by b, a group by a, c, b

. 인덱스 컬럼 중 뒤에 있는 컬럼이 GROUP BY 절에 명시되지 않아도 인덱스는 사용할 수 있다. 아래 모든 케이스는 인덱스가 적용된다 . (index: a,b,c) group by a group by a, b group by a, b, c

인덱스는 사용할 수 있다. 반대로 인덱스 컬럼 중 앞에 있는 컬럼이 GROUP BY 절에 명시되지 않으면 인덱스를 사용할 수 없다 ex: (index: a,b,c), group by b, c 는 인덱스 적용안됨

인덱스를 사용할 수 없다 인덱스에 없는 컬럼이 GROUP BY 절에 포함되어 있으면 인덱스가 적용되지 않는다. ex: (index: a,b,c), group by a,b,c,d 는 인덱스 적용안됨

여기서 WHERE 조건과 GROUP BY 가 함께 사용되면 WHERE 조건이 동등 비교일 경우 GROUP BY 절에 해당 컬럼은 없어도 인덱스가 적용 됩니다.

즉, 아래 2개의 쿼리는 모두 정상적으로 인덱스가 적용 됩니다.

(인덱스 – a,b,c)

WHERE a = 1 GROUP BY b, c WHERE a = 1 and b = ‘b’ GROUP BY c

그렇다면 WHERE의 조건이 동등 비교가 아닌 경우엔 어떻게 될까요?

한번 실험해보겠습니다.

1-3-1. WHERE가 동등 비교가 아닌 경우

먼저 동등 비교의 실행 계획을 확인해봅니다.

(인덱스 – offset_type, customer_id, base_date)

select * from temp_ad_offset where offset_type = ‘GIVE_OFFSET’ group by customer_id, base_date limit 2000000, 100;

해당 쿼리의 실행 계획은 아래와 같습니다.

1-2 에서 소개한 실행 계획과 거의 유사한 결과가 나왔습니다.

key항목을 보면 WHERE절의 인덱스가 잘 수행된 것을 확인할 수 있습니다.

Extra 항목에는 Using temporary 와 Using filesort 가 없는데, 이는 아래에서 설명하겠습니다. 다만, 이 둘이 없다는 것은 GROUP BY가 인덱스를 잘 탔다 정도로 보시면 됩니다.

와 가 없는데, 이는 아래에서 설명하겠습니다.

전체 수행 시간은 5.683초가 소요되었습니다.

이 시간이 오래 걸린것인지 정확히 알 수 없으니, 바로 다음 실험으로 가보겠습니다.

이번엔 WHERE의 조건만 like 로 변경해보겠습니다.

LIKE 조건은 인덱스가 가능하도록 % 를 검색어 뒤편에 두겠습니다.

LIKE 검색에서 %가 검색어 앞에 있을 경우 인덱스를 타지 않습니다.

select * from temp_ad_offset where offset_type like ‘GIVE%’ group by customer_id, base_date limit 2000000, 100;

실행 계획은 다음과 같이 나왔습니다.

key항목을 보면 WHERE절의 인덱스가 잘 수행된 것을 확인할 수 있습니다.

Extra 항목에는 Using temporary 와 Using filesort 가 추가되었습니다. 인덱스 Key대로 GROUP BY가 되었다면, 인덱스 Key대로 그룹핑만 진행하면 되기 때문에 별도의 임시 테이블 (temporary)를 만들어 그 안에서 정렬 (filesort)를 할 필요가 없습니다. 즉, GROUP BY가 인덱스 순서대로 잘 탔다면, 이 2개 항목이 등장하지 않는다는 점을 명심해주세요.

와 가 추가되었습니다.

GROUP BY가 제대로 인덱스를 타지 못한것 같습니다.

실제로 수행 시간을 확인해볼까요?

1분 17초가 수행되었습니다.

명백하게 성능 차이가 발생하죠?

자 그럼 여기서 첫번째 쿼리를 커버링 인덱스로 더 성능을 올려보겠습니다.

(즉, WHERE-GROUP BY가 인덱스를 탄 상황에서 SELECT 절까지 인덱스를 타도록 하는 것입니다.)

select offset_type, customer_id, base_date from temp_ad_offset where offset_type = ‘GIVE_OFFSET’ group by customer_id, base_date limit 2000000, 100;

실행 계획에서는 커버링 인덱스가 잘 수행된 것을 확인할 수 있습니다.

수행 시간은 1.6초로 기존 (5.683초) 대비 5배 이상 개선되었습니다.

WHERE 뿐만 아니라, GROUP BY절, SELECT절 역시 인덱스를 타게 되면 얼마나 성능이 개선되는지 알게 되었습니다!

1-4. 마무리

이번 포스팅에서는 커버링 인덱스의 기반 지식들과, SELECT, WHERE, GROUP BY 등의 인덱스 방식 등을 배워보았습니다.

다음 시간에는 WHERE-GROUP BY외에 WHERE-ORDER BY, WHERE-ORDER BY-GROUP BY등이 다 같이 모여있을때는 어떻게 되는지 같이 실험해보겠습니다.

[MySQL] 커버링 인덱스

반응형

커버링 인덱스는 쿼리의 조건을 충족시키는데 필요한 모든 데이터들을 인덱스에서만 추출할 수 있는 인덱스를 의미합니다. 커버링 인덱스는 B-Tree 인덱스를 스캔하는 것만으로도 원하는 데이터를 가져 올 수 있으며, 컬럼을 읽기 위해 디스크에 접근하여 데이터 블록을 읽지 않아도 됩니다. 인덱스는 행 전체의 크기보다 훨씬 작으며, 인덱스의 값에 따라 정렬이 되기 때문에 Sequential Read 접근이 가능해집니다. 따라서 커버링 인덱스를 활용하면 쿼리의 성능을 비약적으로 향상시킬 수 있습니다.

먼저 커버링 인덱스의 성능에 대해 테스트를 해보겠습니다.

테이블 생성

테이블은 아래와 같은 스키마로 생성하였습니다.

create table membertest ( member_no int auto_increment, member_id varchar(50) not null, group_no int not null, name varchar(30) not null, created_date datetime default now() not null, constraint membertest_pk primary key (member_no) );

인덱스는 (group_no, name) 컬럼으로 생성하였고, 데이터는 약 1000만 건을 입력해두었습니다.

그리고 아래와 같이 쿼리를 각각 수행해보았습니다.

<일반 쿼리>

수행 속도 : 40s 835ms

select * from membertest limit 5000000, 1000;

<커버링 인덱스 쿼리>

수행 속도 : 776ms

select * from ( select t.member_no from membertest limit 5000000, 1000 ) as i join membertest as m on i.member_no = m.member_no;

위의 두 쿼리는 같은 결과값을 반환하지만 수행 속도면에서 엄청난 차이를 보이고 있습니다. 커버링 인덱스가 어떤 역할을 하기에 속도 차이가 극적으로 나타나는 걸까요? 우선 두 쿼리의 실행 계획을 살펴보겠습니다.

<일반 쿼리의 실행 계획>

<커버링 인덱스 실행 계획>

커버링 인덱스의 실행 계획을 보면 3번째 row의 extra에서 Using index를 확인할 수 있습니다. 이는 쿼리 수행에 커버링 인덱스가 사용되었다는 뜻입니다.

두 쿼리의 성능 차이가 나는 이유

일반 쿼리의 실행 계획을 보면 group_name이라는 인덱스가 사용되었지만 select 절의 컬럼을 완성하기 위해서 데이터 블록에 접근(디스크에 접근)하게 됩니다.

커버링 인덱스의 실행 계획을 보면 extra 항목에 Using index가 나타납니다. 이 쿼리는 인덱스에 포함된 컬럼(group_no)만으로도 select 절의 컬럼(서브 쿼리의 select 절)을 완성할 수 있습니다. 즉, 디스크에 접근하지 않고도 검색하고자 하는 row의 인덱스를 추출해올 수 있습니다. 결과적으로 추출된 인덱스만으로 데이터 블록에 접근하여 원하는 데이터를 가져올 수 있게 됩니다. 위의 경우 서브 쿼리에서 1000건의 인덱스를 추출한 후에 데이터 블록에 접근하게 됩니다.

클러스터드 인덱스(Clustered Index)와 넌 클러스터드 인덱스(Non Clustered Index)

Clustered Index

Primary Key를 대상으로 생성합니다.

Primary Key가 없을 경우 Unique Key를 대상으로 생성합니다.

Primary Key 또는 Unique Key 둘 다 없을 경우에는 6 Byte의 Hidden Key를 생성합니다. (rowid)

Clustered Index를 기준으로 데이터 레코드를 물리적으로 정렬합니다. ( 이는 Primary Key가 변경되면 그 레코드의 물리적 위치까지 변경되어야 한다는 의미입니다. 즉, Primary Key에 대한 의존도가 상당하기 때문에 신중하게 결정해야합니다. )

) 테이블 당 1개만 존재 가능합니다.

Non Clustered Index

데이터를 물리적으로 재배열하지 않습니다.

일반적인 인덱스를 말합니다.

테이블 당 여러 개 생성할 수 있습니다.

별도의 공간에 인덱스 테이블을 생성하여 데이터를 정렬합니다. 다음 그림은 Non Clustered Index와 Clustered Index를 활용하여 데이터를 탐색하는 과정을 보여줍니다.

https://jojoldu.tistory.com/476

age 컬럼을 인덱스로 생성하였고, Non Clustered Index에서 age를 기준으로 정렬되어 있습니다. 그리고 Non Clustered Index에 인덱스의 컬럼 값과 Clustered Index의 값을 포함하고 있습니다. 이는 Non Clustered Index에는 실제 데이터 레코드가 없고 Clustered Index만이 해당 데이터 레코드를 알고 있기 때문입니다.

여기서 앞서 살펴보았던 커버링 인덱스의 개념을 이해할 수 있습니다. 즉, 실제 데이터의 접근이 없이 인덱스의 컬럼만으로 쿼리를 완성하는 것입니다.

WHERE + GROUP BY

group by에서 인덱스는 아래의 조건에서 적용됩니다.

group by 절에 명시된 컬럼이 인덱스 컬럼의 순서와 같아야 합니다. 아래의 모든 케이스는 인덱스가 적용되지 않습니다. (index : a, b, c) group by b group by b, a group by a, c, b

인덱스 컬럼 중 뒤에 있는 컬럼이 group by 절에 명시되지 않아도 인덱스는 사용할 수 있습니다. 아래의 모든 케이스는 인덱스가 적용됩니다. (index : a, b, c) group by a group by a, b group by a, b, c

반대로 인덱스 컬럼 중 앞에 있는 컬럼이 group by 절에 명시되지 않으면 인덱스를 사용할 수 없습니다. 아래의 케이스는 인덱스가 적용되지 않습니다. (index : a, b, c) group by b, c

인덱스에 없는 컬럼이 group by 절에 포함되어 있으면 인덱스가 적용되지 않습니다. 아래의 케이스는 인덱스가 적용되지 않습니다. (index : a, b, c) group by a, b, c, d

where 조건과 group by 가 함께 사용되면 where 조건이 동등 비교인 경우에 group by 절에 해당 컬럼이 없어도 인덱스가 적용됩니다. 아래의 쿼리는 모두 인덱스가 적용됩니다. (index : a, b, c) where a = 1 group by b, c where a = 1 and b = ‘b’ group by c

참고자료

MySQL에서 커버링 인덱스로 쿼리 성능을 높여보자!!

https://jojoldu.tistory.com/476

https://mozi.tistory.com/320

https://12bme.tistory.com/149

https://lng1982.tistory.com/144

https://denodo1.tistory.com/306

반응형

mysql 커버링 인덱스란 무엇인가?

mysql 커버링 인덱스란 무엇인가? | sTricky

mysql 커버링 인덱스란 무엇인가? sTricky

일전에 SQL 튜닝 의뢰가 들어왔습니다.

요청 받은 SQL을 보니 특정 테이블을 self조인하는 형태 였습니다. 물론 SQL을 작성하면서 self조인은 필수불가결 할 때가 있죠. self조인 자체가 문제가 있는것은 아닙니다. 하지만 중요한것은 self 조인 역시 필요할 때만 써야 한다는것 이란거죠. 그래서 요청하신 분께 다시 문의를 드리니 커버링 인덱스를 쓰기 위한 self조인이라고 말 했습니다.

커버링 인덱스, 그건 무엇일까요?

그것에 대해서 알아보도록 하겠습니다.

커버링 인덱스란

커버링 인덱스라는건 어떤 SQL에서 원하는 출력 데이터와 조건 데이터가 모두 인덱스에 존재 하는 경우를 이야기 합니다. B-Tree 스캔으로만 모든 데이터를 알 수 있기때문에 인덱스에 있는 주소값을 참조하여 데이터 블록으로 가지 않고 출력까지 가능 한 경우를 이야기 합니다.

커버링 인덱스를 사용하면 쿼리의 성능이 아주 좋아지는 장점이 있습니다.

커버링 인덱스 실습

아래와 같이 테이블을 만들고, 데이터를 넣고, 인덱스를 생성 해보도록 하겠습니다.

SQL은 아래와 같습니다.

create table address_svc_m.cover_index ( id int(11) auto_increment, sido_name varchar(100), sgg_name varchar(100), sido_code varchar(100), sgg_code varchar(100), primary key (id) ); create index cover_index_id_sido_name_sgg_name_index on address_svc_m.cover_index (id, sido_name, sgg_name);

아래와 같이 테이블과 인덱스가 생성 된 것을 확인 할 수 있습니다.

커버링 인덱스 실습1

그리고 아래와 같이 select SQL을 실행 합니다.

select id, sido_name, sgg_name from address_svc_m.cover_index where sgg_name = ‘창원시 진해구’

결과가 아주 잘 나왔네요.

커버링 인덱스 실습2

그럼 이 SQL의 실행 계획을 살펴보도록 하겠습니다.

커버링 인덱스 실습3

실행 계획을 살펴보시면 cover index 라는게 보이실 겁니다.

위에서 테이블을 생성하고 인덱스를 생성 할 때 id, sido_name, sgg_name 컬럼으로 인덱스를 만들었는데, 위 SQL에서 해당 컬럼들로만 조건을 주고 출력을 하기 때문에 이렇게 커버링 인덱스가 동작을 하게 되는 겁니다.

이렇게 오늘 커버링 인덱스에 대해서 알아 보았습니다.

감사합니다.

by.sTricky

MySQL에서 커버링 인덱스로 쿼리 성능을 높여보자!! – gywndi’s database

안녕하세요. 오늘 짧지만 재미있는 내용을 하나 공유할까 합니다.

커버링 인덱스(Covering Index)라는 내용인데, 대용량 데이터 처리 시 적절하게 커버링 인덱스를 활용하여 쿼리를 작성하면 성능을 상당 부분 높일 수 있습니다.

커버링 인덱스란?

커버링 인덱스란 원하는 데이터를 인덱스에서만 추출할 수 있는 인덱스를 의미합니다. B-Tree 스캔만으로 원하는 데이터를 가져올 수 있으며, 칼럼을 읽기 위해 굳이 데이터 블록을 보지 않아도 됩니다.

인덱스는 행 전체 크기보다 훨씬 작으며, 인덱스 값에 따라 정렬이 되기 때문에 Sequential Read 접근할 수 있기 때문에, 커버링 인덱스를 사용하면 결과적으로 쿼리 성능을 비약적으로 올릴 수 있습니다.

백문이 불여일견! 아래 테스트를 보시죠.

테이블 생성

먼저 다음과 같이 테이블을 생성합니다.

create table usertest ( userno int(11) not null auto_increment, userid varchar(20) not null default ”, nickname varchar(20) not null default ”, .. 중략 .. chgdate varchar(15) not null default ”, primary key (userno), key chgdate (chgdate) ) engine=innodb;

약 1,000만 건 데이터를 무작위로 넣고 몇가지 테스트를 해봅니다.

커버링 인덱스(SELECT)

select chgdate , userno from usertest limit 100000, 100

************* 1. row ************* id: 1 select_type: SIMPLE table: usertest type: index possible_keys: NULL key: CHGDATE key_len: 47 ref: NULL rows: 9228802 Extra: Using index 1 row in set (0.00 sec)

쿼리 실행 계획의 Extra 필드에 “Using Index” 결과를 볼 수 있는데, 이는 인덱스만으로 원하는 데이터 추출을 하였음을 알 수 있습니다.

이처럼 데이터 추출을 인덱스에서만 수행하는 것을 커버링 인덱스라고 합니다. 아시겠죠? ^^

그렇다면 일반 쿼리와 성능 테스트를 해볼까요?

커버링 인덱스(WHERE)

1) 일반 쿼리

select * from usertest where chgdate like ‘2010%’ limit 100000, 100

쿼리 수행 속도는 30.37초이며, 쿼리 실행 계획은 다음과 같습니다.

************* 1. row ************* id: 1 select_type: SIMPLE table: usertest type: range possible_keys: CHGDATE key: CHGDATE key_len: 47 ref: NULL rows: 4352950 Extra: Using where

Extra 항목에서 “Using where” 내용은, Range 검색 이후 데이터는 직접 데이터 필드에 접근하여 추출한 것으로 보면 됩니다.

2) 커버링 인덱스 쿼리

select a.* from ( select userno from usertest where chgdate like ‘2012%’ limit 100000, 100 ) b join usertest a on b.userno = a.userno

쿼리 수행 시간은 0.16초이며 실행 계획은 다음과 같습니다.

************* 1. row ************* id: 1 select_type: PRIMARY table: type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 100 Extra: ************* 2. row ************* id: 1 select_type: PRIMARY table: a type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: b.userno rows: 1 Extra: ************* 3. row ************* id: 2 select_type: DERIVED table: usertest type: range possible_keys: CHGDATE key: CHGDATE key_len: 47 ref: NULL rows: 4352950 Extra: Using where; Using index

Extra 에서 “Using Index”를 확인할 수 있습니다.

그렇다면 30초 넘게 수행되는 쿼리가 0.16초로 단축됐습니다. 왜 이렇게 큰 차이가 발생했을까요?

첫 번째 쿼리는 Where에서 부분 처리된 결과 셋을 Limit 구문에서 일정 범위를 추출하고, 추출된 값을 데이터 블록에 접근하여 원하는 필드를 가져오기 때문에 수행 속도가 느립니다.

두 번째 쿼리에서도 동일하게 Where에서 부분 처리된 결과 셋이 Limit 구문에서 일정 범위 추출되나, 정작 필요한 값은 테이블의 Primary Key인 userno 값입니다. InnoDB에서 모든 인덱스 Value에는 Primary Key를 값으로 가지기 때문에, 결과적으로 인덱스 접근만으로 원하는 데이터를 가져올 수 있게 됩니다. 최종적으로 조회할 데이터 추출을 위해서 데이터 블록에 접근하는 건 수는 서브 쿼리 안에 있는 결과 갯수, 즉 100건이기 때문에 첫 번째 쿼리 대비 월등하게 좋은 성능이 나온 것입니다.

커버링 인덱스(ORDER BY)

커버링 인덱스를 잘 사용하면 Full Scan 또한 방지할 수 있습니다. 대부분 RDBMS에는 테이블에 대한 통계 정보가 있고, 통계 정보를 활용해서 쿼리 실행을 최적화 합니다.

다음 재미있는 테스트 결과를 보여드리겠습니다. 전체 테이블에서 chgdate 역순으로 400000번째 데이터부터 10 건만 가져오는 쿼리입니다.

1) 일반 쿼리

select * from usertest order by chgdate limit 400000, 100

************* 1. row ************* id: 1 select_type: SIMPLE table: usertest type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 9228802 Extra: Using filesort 1 row in set (0.00 sec)

분명 인덱스가 있음에도, Full Scan 및 File Sorting이 발생합니다. 인덱스를 태웠을 때 인덱스 블록을 읽어들이면서 발생하는 비용보다 단순 Full Scan이 더 빠르다고 통계 정보로부터 판단했기 때문이죠. 인덱스도 데이터라는 것은 항상 기억하고 있어야 합니다^^

결과 시간은 책정 불가입니다. (안끝나요~!)

2) 커버링 인덱스 쿼리

위 결과와 다르게 커버링 인덱스는 조금 더 재미있는 결과를 보여줍니다.

select a.* from ( select userno from usertest order by chgdate limit 400000, 100 ) b join usertest a on b.userno = a.userno

************* 1. row ************* id: 1 select_type: PRIMARY table: type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 100 Extra: ************* 2. row ************* id: 1 select_type: PRIMARY table: a type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: b.userno rows: 1 Extra: ************* 3. row ************* id: 2 select_type: DERIVED table: usertest type: index possible_keys: NULL key: CHGDATE key_len: 47 ref: NULL rows: 400100 Extra: Using index

File Sorting이 발생하지 않고 커버링 인덱스가 사용되었으며, 실행 시간 또한 0.24초로 빠르게 나왔습니다.^^

Conclusion

커버링 인덱스는 InnoDB와 같이 인덱스와 데이터 모두 메모리에 올라와 있는 경우에 유용하게 쓰일 수 있습니다. 물론 커버링 인덱스가 좋기는 하지만, 커버링 인덱스를 사용하기 위해 사용하지 않는 인덱스를 주구장창 만드는 것은 최대한 피해야 하겠죠^^

잊지마세요. 인덱스도 데이터라는 사실을..

커버링 인덱스

반응형

커버링 인덱스

커버링 인덱스(Covering Index)는 원하는 데이터를 인덱스에서만 추출할 수 있는 인덱스를 의미한다. B-Tree 스캔만으로 원하는 데이터를 가져올 수 있으며, 칼럼을 읽기 위해 실제 데이터 블록에 접근할 필요가 전혀 없다.

인덱스는 행 전체 크기보다 훨씬 작고 인덱스 값에 따라 정렬이 되기 때문에 Sequential Read로 접근할 수 있기 때문에 쿼리 성능을 크게 향상할 수 있다.

그래서 인덱스를 설계한다고 해서 WHERE 절에 국한된 문제가 아니라, 사실 쿼리 전체에 대해 인덱스 설계가 필요하다.

예시

테이블 생성

create table user ( id int(11) not null auto_increment, name varchar(20) not null default ”, email varchar(40) not null default ”, — … 생략 chgdate varchar(15) not null default ”, key chgdate (chgdate) ) engine = innodb;

해당 테이블에 약 1,000만 건의 데이터를 무작위로 넣고 테스트를 진행한다.

아래의 sql문을 실행해보자.

select userno from user limit 100000, 100

다음은 해당 쿼리의 실행 계획이다.

************* 1. row ************* id: 1 select_type: SIMPLE table: user type: index possible_keys: NULL key: CHGDATE key_len: 47 ref: NULL rows: 9228802 Extra: Using index 1 row in set (0.00 sec)

쿼리 실행 계획의 Extra 필드에 Using Index 라는 결과를 볼 수 있는데, 이는 쿼리의 모든 항목이 인덱스 컬럼으로 이루어져 있기 때문에 인덱스만으로 데이터를 추출하였음을 알 수 있다.

이처럼 데이터 추출을 인덱스에서만 수행하는 것을 커버링 인덱스라고 한다.

비교

1) 일반 쿼리

먼저 user를 조회할텐데 name을 조건으로 전체 컬럼을 조회하는 경우이다.

select * from user where chgdate like ‘2010%’ limit 100000, 100

쿼리 수행 속도는 30.37초이며, 쿼리 실행 계획은 다음과 같다.

************* 1. row ************* id: 1 select_type: SIMPLE table: user type: range possible_keys: CHGDATE key: CHGDATE key_len: 47 ref: NULL rows: 4352950 Extra: Using where

2) 커버링 인덱스를 사용한 쿼리

다음 쿼리는 커버링 인덱스를 사용해서 필요한 데이터의 id 목록만을 먼저 조회한 후 해당 id 목록으로 전체 컬럼을 한번 더 조회한다.

select a.* from ( select id from user where chgdate like ‘2012%’ limit 100000, 100 ) b join user a on b.id = a.id

이 경우 인덱스만으로 필요한 컬럼을 빠르게 조회한 이후 좁혀진 범위의 데이터에 다른 컬럼을 채워주면 된다.

쿼리 수행시간은 0.16초가 수행되며 실행 계획은 다음과 같다.

************* 1. row ************* id: 1 select_type: PRIMARY table: type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 100 Extra: ************* 2. row ************* id: 1 select_type: PRIMARY table: a type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: b.id rows: 1 Extra: ************* 3. row ************* id: 2 select_type: DERIVED table: user type: range possible_keys: CHGDATE key: CHGDATE key_len: 47 ref: NULL rows: 4352950 Extra: Using where; Using index

**3. row** 의 Extra를 보면 Using Index로 커버링 인덱스를 사용했음을 알 수 있다. 이게 가능했던 이유는 테이블을 생성할 때 PK를 id로 하고 chgdate를 가진 Index를 추가했다. 이 때 chgdate 인덱스는 PK를 가지고 있다. 이유는 Non-Clustered key는 데이터 블록의 위치가 없어서 Clustered Key 값으로 데이터 블록을 찾는 과정이 필요하기 때문이다.

쿼리 수행시간의 차이가 극명하다.

가장 큰 이유로는 첫 번째 쿼리에서는 Where에서 부분 처리된 결과 셋을 Limit 구문에서 범위를 추출하고 추출된 값을 이용해서 데이터 블록에 접근해서 원하는 레코드를 가져오기 때문에 처리가 비교적 느리다.

반면, 커버링 인덱스를 사용하는 두 번째 쿼리에서는 필요한 모든 컬럼이 인덱스에 포함되어 있기 때문에 인덱스 내에서 조건을 걸고 범위를 추출하니 훨씬 작업이 수월하다. 데이터 추출을 위해서는 해당 범위의 데이터 주소를 찾는 것이 아니라 바로 데이터 블록의 해당 위치에 접근하기 때문에 성능이 뛰어나다.

추가적으로 예제에서는 Where 절만을 사용하였다. Group by, Order by 절도 있다면 커버링 인덱스의 역할은 더 커지게 된다.

Reference

반응형

커버링 인덱스

커버링 인덱스

커버링 인덱스란 인덱스만 이용해서 데이터를 추출할수 있는 인덱스를 의미합니다. 인덱스에서만 데이터를 추출하기 때문에 Disk I/O를 발생시키지 않고 데이터를 쉽게 가지고 올수가 있다.

사용 예

Order By 쿼리

(a, b) index가 존재한다면 a에 조건을 걸고, b를 정렬하는 쿼리를 성능을 높일수가 있다.

SELECT a , b FROM tbl WHERE a > 1 AND a < 5 AND b < 'K' ORDER BY b ; 데이터 데이터 Range 처리 대용량 데이터를 처리할때 JOIN이 많이 존재하게 되면 실행계획이 이상하게 풀려 제대로 인덱스를 타지 않고 Full-Scan이 될수가 있다. 이때 Driver 테이블의 id만 먼저 추출을 하고 in Query를 이용해서 처리를 할수가 있습니다. id만 추출할때 커버링 인덱스를 이용하여 조건을 줄수가 있습니다. 기존 쿼리 SELECT * FROM product p INNER JOIN product_stock ps ON p . productId = ps . productId INNER JOIN product_images pi ON p . productId = pi . productId INNER JOIN product_property pp ON p . productId = pp . productId WHERE p . createdAt >= ‘2017-07-31 00:00:00’ AND p . createdAt <= '2017-07-31 23:59:59' ; 데이터의 양이 많아지면 inner join 테이블 (product_stock, product_images)를 먼저 join을 한후 WHERE 조건을 타게 되서 Full-Scan이 발생될수가 있다. 튜닝한 쿼리 Index를 먼저 출력을 한다. ALTER INDEX product_idx01 ON product ( createdAt ) productId만 가지고 온다. SELECT productId FROM product p WHERE p . createdAt >= ‘2017-07-31 00:00:00’ AND p . createdAt <= '2017-07-31 23:59:59' ; productId List와 In Query를 이용하여 다시한번 쿼리 실행한다. SELECT * FROM product p INNER JOIN product_stock ps ON p . productId = ps . productId INNER JOIN product_images pi ON p . productId = pi . productId INNER JOIn product_property pp ON p . productId = pp . productId WHERE p . productId in ( productIdLists . . . . . ) Select Query를 2번이상 사용했지만, 상황 (데이터의 양 등)에 따라 inner join이 3번이 있는 Query 1번보다 2번이상의 Select가 더욱더 빠른 쿼리 성능을 낼수가 있다. Reference

키워드에 대한 정보 커버링 인덱스

다음은 Bing에서 커버링 인덱스 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [10분 테코톡] 👨‍🏫안돌의 INDEX

  • 안돌
  • 우아한테크코스
  • 우테코 1기
  • 우테코
  • 데이터베이스
  • index
  • 인덱스
  • 김용주
[10분 #테코톡] #👨‍🏫안돌의 #INDEX


YouTube에서 커버링 인덱스 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [10분 테코톡] 👨‍🏫안돌의 INDEX | 커버링 인덱스, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment