안녕하세요 2년차 개발자 입니다.
특정 테이블의 ROW 수가 약 1억건 정도 됩니다. 제가 필요한 데이터는 약 2000건 정도 되구요.
현재 제가 제공받은 쿼리는 아래와 같은데 "이력" 테이블이 1억건이 들어있는 테이블입니다.
2000건을 조회하는데에는 약 4분~5분 정도 걸립니다..문제는 이 데이터가 거의 실시간 성으로? 나와야 하는데..인덱스가 걸려있지 않습니다.
인덱스 생성을 위해 대용량 테이블 인덱스 관련 정보를 조금 찾아봤는데 이해가 되지 않는 부분이 있어서 질문 드립니다.
1. 선택도 고려
아래 쿼리에서는 "설비코드"가 선택도가 가장 좋습니다. 그럴 경우에 "설비코드", "그룹코드", "공장코드" 순으로 생성하면 될까요?
또한 "신호", EndTime(datetime type)을 추가로 인덱스 생성을 원하는 경우 EndTime, "신호" 순으로 생성하면 될까요?
2. 인덱스 효율
대용량 테이블에 인덱스를 설정 할 때는 많은 것을 고려 해야 한다고 봤는데
기본 적으로 "이력" 테이블은 INSERT 작업이 꾸준히 이루어 집니다.
제가 인덱스를 생성 했을 때 눈에 띄게 INSERT, UPDATE ... 작업이 느려질까요?
또 대용량 테이블에서는 인덱스를 이용하여 scan 했을 때 더 느릴 수도 있다는데 어떤 경우에 그럴 수 있을까요?
-------------------------------------------------------------
SELECT
*
FROM 설비
LEFT JOIN
(
SELECT
공장코드, 그룹코드, 설비코드
FROM 이력 A
WHERE 신호 = '정상'
AND EndTime = (
SELECT
MAX(EndTIme)
FROM 이력
WHERE 공장코드 = A.공장코드
AND 그룹코드 = A.그룹코드
AND 설비코드 = A.설비코드
)
) B
ON A.공장코드 = B.공장코드
AND A.그룹코드 = B.그룹코드
AND A.설비코드 = B.설비코드
WHERE A.공장코드 = '특정공장'
Comment 1
-
축구선수
2018.06.01 14:14
인덱스는 1번 처럼 하셔도 좋을것 같고요
2번째 경우에는 인덱스 컬럼에 입력 수정 삭제가 빈번한것은 인덱스로 지정 하는 것이 좋지는 않습니다.
그리고 인덱스 스캔이 느린경우는 인덱스 스캔시 옵티마이저가 인덱스 seek냐 scan 이냐에 따라 달라 질수가 있는데
인덱스 스캔의 경우 인덱스 페이지에서 스캔을 하기때문인데
쉽게 말씀 드리면 조회시 select나 where절에 사용되는 컬럼에 인덱스 컬럼을 사용하시면 거의 index seek가 이루어 지기는데
그렇지 않은 경우 index scan이 이루어 질수도 있어
옵티마이저가 실행시 읽는 페이지가 더 많아지게 되어 조회 데이터가 많을 수록 속도차이가 나게 될 수 있습니다.