본문 바로가기

DataBase29

Offset Based Pagination 성능 이슈 해결하기 Offset Based Pagination 성능 이슈 해결하기기술 블로그의 게시글을 한번에 볼 수 있는 서비스를 운영하고 있습니다. 현재 많은 사용자가 이용하고 있는 건 아니지만, 앞으로 서비스를 지속적으로 유지하기 위해서는 지출되는 비용을 최대한 절감하는 것이 중요하다고 생각했어요.그 중에서도 데이터베이스 성능 이슈를 발견했었고, 이를 해결하고자 합니다.성능 이슈가 발생했던 시점에는, 아래와 같이 페이지 번호를 보여주고 있습니다.클라이언트가 페이지 번호를 클릭할 때마다, 데이터베이스 쿼리가 실행되는 속도를 확인해봤어요.사용자 경험 혹은 리소스 사용 측면에서 봤을 때, 원인을 찾아서 해결해야 하는 것이 중요하다고 생각했습니다.해당 포스팅에서는 데이터베이스 성능 이슈를 발견하고, 이를 개선하기 위해 시도.. 2024. 8. 30.
[MySQL] GROUP BY 절의 인덱스 사용 GROUP BY 절의 인덱스 사용 SQL에서 GROUP BY가 사용된다면, 인덱스의 사용 여부는 어떻게 결정될까? GROUP BY 절에 명시된 칼럼의 순서가 인덱스를 구성하는 칼럼의 순서와 같으면 GROUP BY 절은 일단 인덱스를 사용할 수 있다. 아래 예는 여러개의 칼럼으로 구성된 다중 칼럼 인덱스를 기준으로 한다. GROUP BY 절에 명시된 칼럼이 인덱스 칼럼의 순서와 위치가 같아야한다. 인덱스를 구성하는 칼럼 중에서 뒤쪽에 있는 칼럼은 GROUP BY 절에 명시되지 않아도 인덱스를 사용 할 수 있지만, 인덱스의 앞쪽에 있는 칼럼이 GROUP BY 절에 명시되지 않으면 인덱스를 사용할 수 없다. WHERE 조건절과는 달리 GROUP BY 절에 명시된 칼럼이 하나라도 인덱스에 없으면 GROUP BY.. 2023. 5. 2.
[MySQL] WHERE 절에서의 인덱스 사용 / AND 연산자로 연결된 경우와 OR 연산자로 연결된 경우 인덱스 칼럼 순서와 where 조건절 칼럼 순서가 중요한 이유 다음 구조를 가진 테이블을 살펴보자. CREATE TABLE employees ( id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), age INT, city VARCHAR(50) ); 두가지의 쿼리를 살펴보자. 쿼리 1 SELECT * FROM employees WHERE age > 30 AND city = 'New York'; 쿼리 2 SELECT * FROM employees WHERE city = 'New York' AND age > 30; 쿼리1과 쿼리2는 모두 동일한 조건을 가지지만, WHERE절에서 명시한 컬럼의 순서가 다르다. 그렇다면, 두 개의 인덱스를 만들어.. 2023. 4. 19.
[MySQL] WHERE 절 / 칼럼의 값을 변경했을 때의 인덱스 적용 / 비교 대상의 데이터 타입 칼럼을 가공한 후 다른 상숫값 비교 인덱스를 사용하기 위한 기본 규칙 WHERE 절이나 ORDER BY 또는 GROUP BY가 인덱스를 사용하려면 기본적으로 인덱스된 칼럼의 값 자체를 변환하지 않고 그대로 사용한다는 조건을 만족해야 한다. 인덱스는 칼럼의 값을 아무런 변환 없이 B-Tree에 정렬해서 저장하기 때문이다. WHERE 절이나 ORDER BY 또는 GROUP BY에서도 원본값을 검색하거나 정렬할 때만 B-Tree에 정렬된 인덱스를 이용한다. 인덱스를 적절하게 이용하지 못하는 경우 아래 쿼리는 WHERE 절에서 칼럼을 가공한 후 다른 상숫값과 비교했을 때, 인덱스를 적절하게 이용하지 못하는 경우다. SELECT * FROM salaries WHERE salary*10 > 150000; 위 쿼리를.. 2023. 4. 19.
[MySQL] 처리 대기(SLEEP)와 벤치마크(BENCHMARK) SLEEP(): 일부로 쿼리의 실행을 멈추는 함수SLEEP() 함수는 프로그래밍 언어나 쉡 스크립트 언에서 제공하는 sleep 기능을 수행한다. SQL의 개발이나 디버깅 용도로 잠깐 대기하거나 일부로 쿼리의 실행을 오랜시간 유지하고자 할 때 상당히 유용한 함수이다. 해당 함수는 대기할 시간을 초 단위로 인자를 받으며, 특별히 어떠한 처리를 하거나 반환 값을 넘겨주지 않는다. 단지 지정한 시간만큼 대기할뿐이다.SELECT SLEEP(1.5) FROM {테이블명} 추가적으로, 레코드이 건수만큼 SLEEP() 함수를 호출하기 때문에 조회되는 레코드가 총 10건이라고 하면, 결국 전체적으로 15초 동안 쿼리를 실행하는 셈이 된다. BENCHMARK(): 간단한 함수의 성능 테스트를 하는 함수디버깅이나 간단한 함.. 2023. 4. 11.
[MySQL] CASE WHEN과 서브쿼리를 활용한 쿼리 최적화 CASE WHEN 이란? CASE WHEN은 함수가 아닌 SQL 구문이다. 프로그래밍 언에서 제공하는 SWTICH 구문과 같은 역할을 한다. CASE로 시작하고 END로 끝나야 하며, WHEN ... THEN ... 은 필요한 만큼 반복해서 사용할 수 있다. CASE WHEN 조건 THEN '반환 값' WHEN 조건 THEN '반환 값' ELSE 'WHEN 조건에 해당 안되는 경우 반환 값' END 동등 연산자(=)로 비교할 수 있을 때 비교하고자 하는 컬럼이나 표현식을 CASE와 WHEN 키워드 사이에 두고, 비교 기준값을 WHEN 뒤에 입력해서 사용하는 방식이다. CASE WHEN 구문에서 한 가지 중요한 사실은 CASE WHEN 절이 일치하는 경우에만 THEN 이하의 표현식이 실행된다는 점이다. C.. 2023. 4. 11.