Database/Mysql 45

[업무에 바로 쓰는 SQL 튜닝] 5. 악성 SQL 튜닝으로 전문가 되기

양바른 님의 "Real MySQL" 책을 정리한 포스팅 입니다. 1. SQL 문 재작성으로 착한 쿼리 만들기처음부터 모든 데이터를 가져오는 SQL문explainselect 사원.사원번호, 급여.평균연봉, 급여.최고연봉, 급여.최저연봉 from 사원, ( select 사원번호, round(avg(연봉), 0) 평균연봉, round(min(연봉), 0) 최고연봉, round(min(연봉), 0) 최저연봉 from 급여 group by 사원번호 ) 급여 where 사원.사원번호 = 급여.사원번호 and 사원.사원번호 between 10001 and 10100;급여 테이블에서 그룹핑 시, 거의 전체 테이블을 스캔함사원 테이블에서 필터링된 데이터는 100건에 불과함 explainselec..

Database/Mysql 2025.03.19

[업무에 바로 쓰는 SQL 튜닝] 4. 악성 SQL 튜닝으로 초보자 탈출하기

양바른 님의 "Real MySQL" 책을 정리한 포스팅 입니다.1. 준비실무적인 튜닝 절차 이해하기1. 현황 파악결과 및 소요 시간 확인실행계획 분석 ("EXPLAIN ANALYZE")단계별 소요 시간 확인 ("SHOW PROFILE FOR QUERY")쿼리 비용 확인 ("SHOW STATUS LIKE 'Last_query_cost'")조인/서브쿼리 구조 확인 ("EXPLAIN")동등/범위 조건프라이머리 키나 유니크 키로 사용되는 지 확인range로 처리되는지 확인ICP를 활용할 수 있는지 확인 2. 튜닝 방향 판단 및 개선 2. SQL 문 단순 수정으로 착한 쿼리 만들기기본키 변형explain select * from 사원 where substring(사원번호,1,4) = 1100 and length(..

Database/Mysql 2025.03.18

[업무에 바로 쓰는 SQL 튜닝] 2. SQL 튜닝 용어를 직관적으로 이해하기

양바른 님의 "Real MySQL" 책을 정리한 포스팅 입니다. 1. 물리 엔진과 오브젝트 용어SQL 프로세스 용어파서사용자가 요청한 SQL 문을 쪼개 최소 단위로 분리하고 트리를 만듬트리를 만들면서 문법 검사를 수행함 전처리기파서에서 생성한 트리를 토대로 SQL 문에 구조적인 문제가 없는지 확인SQL 문에 사용된 오브젝트들이 실직적으로 존재하는지, 접근 권한은 부여되어 있는지 확인 옵티마이저전달된 파서 트리를 토대로 연산 과정을 단순화함 (필요하지 않은 조건을 제거함)실행 계획 수립 (테이블 접근 순서, 인덱스 사용 유무, 임시테이블 사용 유무) 엔진 실행기수립된 실행 계획을 참고하여 스토리지 엔진에서 데이터를 가져옴읽어온 데이터를 정렬하거나 조인불필요한 데이터는 필터링 DB 오브젝트 용어기본키특정 행..

Database/Mysql 2025.03.18

[업무에 바로 쓰는 SQL 튜닝] 1. MySQL과 MariaDB 개요

양바른 님의 "Real MySQL" 책을 정리한 포스팅 입니다. 1. 현황MySQL1995년 오픈소스로 배포된 DBMS2010년 오라클(Oracle)에 인수됨상용 버전과 무료 버전으로 구분됨장점: 대용량 데이터 처리, 높은 가용성, 안정성 MariaDBMySQL 핵심 개발자들이 독립하여 MariaDB 개발MySQL이 오라클에 인수되면서 라이선스 정책 및 개발 방향 변화오픈소스 정책을 유지MySQL 5.5 버전 이후 독자적인 길을 걷기 시작SQL 문법과 실행 계획 출력 방식은 MySQL과 유사옵티마이저 기능 등 일부 차이점 존재 2. 상용 RDBMS와의 차이점구조적 차이구분 Oracle MySQL이중화 스토리지 구조Shared Storage (공유 스토리지) - 통합된 스토리지 하나를 공유Shared-No..

Database/Mysql 2025.03.18

[Real MySQL] 16-2. 복제: 타입

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다. 소스 서버의 바이너리 로그에 기록된 변경내역들을 식별하는 방식에 따라 나뉨 1. 바이너리 로그 파일 위치 기반 복제소스 서버의 바이너리 로그 파일명과 파일 내에서의 위치로 개별 바이너리 로그 이벤트를 식별해서 복제함이벤트 하나하나를 바이너리 로그 파일명과 파일내에서의 위치값의 조합으로 식별함레플레카 서버에서 소스 서버의 어떤 이벤트부터 동기화를 수행할 것인지 설정해야 함어느 이벤트까지 로컬 디스크로 가져왔고 적용했는지 관리다음번에 가져올 이벤트를 표시하려는 목적 필수 사항복제 구성원이 되는 MySQL 서버가 고유의 server_id를 가지고 있어야 함소스 서버에서 반드시 바이너리 로그가 활성화돼 있어야 함기본적으로 활성화 되어 있음..

Database/Mysql 2025.03.14

[Real MySQL] 14-2. 스토어드 프로그램: 참고사항

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.3. 보안 옵션DEFINIER / SQL SECURITY각 스토어드 프로그램을 생성하고 실행하는 권한 DEFINIERCREATE DEFINER='admin'@'%' PROCEDURE sp_test()BEGIN SELECT 'Hello, world!';END;소유권과 같은 의미기본적으로 설정됨 SQL SECURITYCREATE DEFINER='admin'@'%' PROCEDURE sp_test()SQL SECURITY DEFINERBEGIN SELECT * FROM sensitive_data;END;스토어드 프로그램을 실행할 때 누구의 권한으로 실행할지 결정하는 옵션DEFINIER: 생성한 사용자의 권한으로 실행INVOKER..

Database/Mysql 2025.03.13

[Real MySQL] 14-1. 스토어드 프로그램: 기본

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다. 스토어드 프로그램은 스토어드 루틴이라 하며, 절차적인 처리를 위해 제공됨스토어드 프로그램은 스토어드 프로시저, 스토어드 함수, 트리거, 이벤트 등을 모두 아우르는 명칭임모두 똑같은 문법으로 작성할 수 있음1. 장단점장점보안 향상입력값의 유효성을 체크한 후 동적인 SQL을 생성단위별로 실행 권한 부여 가능특정 테이블의 읽기, 쓰기특정 컬럼에 대해 권한 설정 기능의 추상화개발 언어나 도구와 관계없이 생성규칙을 알지 못해도 호출하여 발급받을 수 있음각각 다른 프로그래밍 언어로 생성규칙 적용하여 생성된 값을 각각의 소스코드에서 구현하지 않아도 됨 네트워크 소요 시간 절감애플리케이션에서 데이터베이스에 여러번 질의해야 할 경우, 스토어드 프로..

Database/Mysql 2025.03.13

[Real MySQL] 13-2. 파티션: 종류

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.1. 레인지 파티션파티션 키의 연속된 범위로 파티션을 정의하는 방법MAXVALUE라는 키워드를 이용해 명시되지 않은 범위의 키 값이 담긴 레코드를 저장하는 파티션 정의 가능 용도날짜 기반 (연, 월, 일 단위로 분석)범위 기반 (여러 파티션에 균등하게 나눌 수 있을 때)파티션 키 위주로 검색이 자주 실행될 때 장점큰 테이블을 작은 크기의 파티션으로 분리 가능필요한 파티션만 접근 가능 생성create table tb_article ( article_id int not null auto_increment, reg_date datetime not null, primary key(article_id, reg_date)) partitio..

Database/Mysql 2025.03.13

[Real MySQL] 13-1. 파티션: 개요

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다. 파티션 기능은 큰 테이블을 논리적으로 여러 개의 작은 단위로 나누어 저장하는 기능입니다. 1. 개요파티션을 사용하는 이유단일 INSERT와 단일 또는 범위 SELECT의 빠른 처리파티션하지 않으면 인덱스도 커지고 그만큼 메모리 공간도 많이 필요해짐인덱스 크기가 메모리 사이즈보다 커지면 연산 시 성능이 심각하게 저하됨파티션은 데이터와 인덱스를 조각화해서 물리적 메모리를 효율적으로 사용할 수 있게 만들어줌 데이터의 물리적인 저장소를 분리데이터나 인덱스가 파일 시스템에서 차지하는 공간이 크다면 백업이나 관리작업이 어려워짐단, 파티션별 인덱스를 따로 가지는 것은 지원하지 않음 이력 데이터의 효율적인 관리라이프 사이클이 짧음불필요해진 데이터..

Database/Mysql 2025.03.12

[Real MySQL] 10-3. 실행 계획: 실행 계획 분석

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.  1. id 칼럼테이블들이 조인될 경우, 같은 id 값을 할당받음id 값은 테이블의 접근 순서를 의미하지 않음같은 id라면 먼저 올라온 것이 먼저 접근된 순서임을 의미함 2. select_type 칼럼각 단위 select 쿼리가 어떤 타입의 쿼리인지 표시되는 컬럼 select_type설명예제SIMPLE단순한 SELECT 쿼리로, 서브쿼리를 사용하지 않음. PRIMARYUNION이나 서브쿼리를 포함하는 쿼리에서 가장 바깥쪽의 SELECT 쿼리. UNIONUNION으로 결합된 SELECT 쿼리 중 두 번째 이후의 쿼리. DEPENDENT UNION서브쿼리 내에서 UNION 또는 UNION ALL로 결합된 테이블. UNION RESULT..

Database/Mysql 2025.03.12