Database: 227개의 글
인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분입니다. MySQL에서 사용 가능한 인덱스의 종류 및 특성에서 각 특성의 차이는 상당히 중요하며, 물리 수준의 모델링을 할 때도 중요한 요소가 될 것입니다. 다른 RDBMS에서 제공하는 모든 기능을 제공하지는 않지만, MySQL에서는 인덱싱이나 검색 방식에 따라 다른 스토리지 엔진을 선택해야 할 수도 있기 때문에 여전히 인덱스에 대한 기본 지식은 중요하며, 쿼리 튜닝의 기본이 될 것입니다. 또한 인덱스에만 의존적인 용어는 아니지만, 자주 언급되는 "랜덤(Random) I/O"와 "순차(Sequential) I/O"와 같은 디스크 읽기 방식도 알아두는 것이 좋습니다. 디스크 읽기 방식컴퓨터의 CPU나 메모리와 같은 전기적 특성을 띤 장치의 ..
RDBMS(Relational Database Management System)는 표 형식으로 데이터를 저장하고 대부분은 SQL 언어로 데이터 조작을 수행하는 시스템입니다. 다양한 데이터를 저장한다거나 강력한 질의를 할 수 있어서 가장 범용성이 높은 스토리지입니다. RDBMS의 오픈소스 구현은 MySQL이나 PostgreSQL 등이 있으며, 두 다 실제 운용환경에서 널리 사용되고 있습니다. 많은 기업에서 MySQL을 범용 스토리지로 사용하고 있습니다. RDMBS 종류마다 각기 특성이 있는데, 최근에는 기능적, 성능적으로 팽팽하게 경쟁하고 있으니, 지금까지 축적된 노하우 등을 기준으로 선택하면 됩니다. MySQL 주요 스토리지 엔진에는 MyISAM과 InnoDB, Maria가 있습니다. MyISAMMyIS..
쿼리 실행 구조 쿼리 실행구조는 기능별로 다음과 같이 나눠질 수 있습니다. 1) 파서파서는 사용자 요청으로 들어온 쿼리 문장을 토큰(MySQL이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 형태의 구조로 만들어 내는 작업을 의미합니다. 쿼리 문장의 문법 오류는 이 과정에서 발견되어 사용자에게 오류 메시지를 전달하게 됩니다. 2) 전처리기파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인합니다. 각 토큰을 테이블 이름이나 컬럼 이름 또는 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인하는 과정을 이 단계에서 수행합니다. 실제 존재하지 않거나 권한상 사용할 수 없는 개체의 토큰은 이 단계에서 걸러집니다. 3) 옵티마이저옵..
MySQL의 전체 구조 MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분해서 볼 수 있습니다. 위 그림에서는 MySQL의 쿼리 파서나 옵티마이저 등과 같은 기능을 스토리지 엔진과 구분하고자 "MySQL 엔진"과 "스토리지 엔진"으로 구분했습니다. 그리고 "MySQL 엔진"과 "스토리지 엔진"을 모두 합쳐서 MySQL 또는 MySQL 서버라고 표현합니다. 위는 오라클 전체 구조 입니다. MySQL, Oracle 구조에는 상당한 차이가 있습니다. 실제 기능상에는 큰 차이가 없음에도 이런 차이가 발생하는 이유는 MySQL 구조내 "Pluggable Storage Engine" 때문입니다. MySQL은 내부적으로 성격이 다른 아키텍처 구조를 여러개 포함하고 있습니다. 오라클의 경우 테이블의 데이터..
MySQL 쓰면서 하지 말아야 할 것 17가지 ( https://blog.lael.be/post/370 ) 1. 작게 생각하기 (MySQL ecosystem, 캐싱 사용, 확장 가능한 아키텍처, 복제/파티셔닝 고려) 2. EXPLAIN 실행계획 안보기 3. 잘못된 데이터 타입 선택 4. 스토리지 엔진 이해없이 사용 (단일 엔진으로 전체 아키텍처를 결정했다면 대부분 최적이 아님 / 엔진별 장단점 공부 필수) 5. 인덱스 레이아웃 이해없이 사용 6. 쿼리 캐시에 대한 이해없이 사용 7. Stored Procedure를 무분별한 사용 (다른 RDBMS와 다르게 connection thread에서 실행 계획이 세워짐 - ETL 타입 프로시저 - 아주아주 복잡하지만 자주 실행되지 않는 것 - 한번 요청할 때마다 ..
1. 스토어드 프로그램이란?MySQL에서는 절차적인 처리를 위해 스토어드 프로그램을 이용할 수 있습니다. 스토어드 프로그램은 스토어드 루틴이라고도 하는데, 스토어드 프로시저와 스토어드 함수 그리고 트리거와 이벤트 등을 모두 아우르는 명칭입니다. 스토어드 프로그램 가운데 스토어드 프로시저나 함수는 MySQL 5.0부터 추가된 기능이며, 스케줄러는 MySQL 5.1부터 추가된 기능입니다. 그럼 스토어드 프로그램(프로시저, 함수, 트리거)의 장점과 단점을 살펴보도록 하겠습니다. 1-1. 스토어드 프로그램의 장점- 데이터베이스의 보안 향상MySQL의 스토어드 프로그램은 자체적인 보안 설정 기능을 가지고 있으며, 스토어드 프로그램 단위로 실행 권한을 부여할 수 있습니다. 이러한 보안 기능을 조합해서 특정 테이블의..
MySQL의 파티션은 5.1 버전부터 도입됐지만 아직은 많은 제약을 지니고 있습니다. 물론 MySQL 5.5 버전에서 해결된 문제도 있지만 아직 MySQL의 파티션은 모두에게 익숙하지 않으므로 자세한 제약사항을 한번 살펴보겠습니다. - 숫자값(INTEGER 타입 컬럼 또는 INTEGER 타입을 반환하는 함수 및 표현식)에 의해서만 파티션이 가능합니다. MySQL 5.5 부터는 숫자 타입뿐 아니라 문자열이나 날짜 타입 모두 사용할 수 있도록 개선되었습니다. - 키 파티션은 해시 함수를 MySQL이 직접 선택하기 때문에 컬럼 타입 제한이 없습니다. - 최대 1024개의 파티션을 가질 수 있습니다. (서브 파티션까지 포함) - 스토어드 루틴이나 UDF 그리고 사용자 변수 등을 파티션 함수나 식에 사용할 수 없..
파티션이란 MySQL 서버의 입장에서는 데이터를 별도의 테이블로 분리해서 저장하지만 사용자 입장에서는 여전히 하나의 테이블로 읽기와 쓰기를 할 수 있게 해주는 솔루션 입니다. 일반적으로 DBMS의 파티션은 하나의 서버에서 테이블을 분산하는 것이며, 원격 서버 간에 분산을 지원하는 것은 아닙니다. MySQL 5.1부터 제공되는 파티션 기능은 MyISAM과 InnoDB 테이블 등 대부분의 스토리지 엔진에서 사용할 수 있습니다. 파티션 방법은 1. 해시 2. 리스트 3. 키 4. 레인지 총 네가지가 존재합니다. 이외에 서브 파티셔닝 기능까지 사용할 수 있습니다. MySQL 파티션이 적용된 테이블에서 INSERT나 SELECT 등과 가은 쿼리가 어떻게 실행되는지 이해한다면 파티션을 어떻게 사용하는 것이 가장 최..
DB 데이터를 파일로 추출하여 엑셀파일로 작업해야하는 경우가 생기기도 합니다. 아래 쿼리는 DB 명령프롬프트 창에서 해당 SELECT문을 파일로 저장하는 쿼리 예제입니다. SELECTusers.id, ifnull(payment.payment_count, 0) as payment_countINTO OUTFILE '20170101_paycount.log' FIELDS TERMINATED BY '|'FROM(select id from users where (withdraw_date > '2016-01-01' and withdraw_date < '2016-12-31') or withdraw_date is null) usersLEFT JOIN(select order_user_id as id, count(payme..
mysql 데이터베이스 백업시 mysqldump를 이용합니다. 개발자들이 사용하는 Workbench나 HeidiSQL 같은 툴에서 백업하는것 역시 mysqldump를 실행하는 것입니다. 전체 데이터베이스를 한 sql파일에 백업하는 것이 가장 간단하지만, 서버 용량 문제로 분할백업을 진행해야하는 경우가 생깁니다. 분할백업 진행 전 테이블별 용량 확인도 가능합니다. SELECT table_name, table_rows, round(data_length/(1024*1024), 2) as 'DATA_SIZE(MB)', round(index_length/(1024*1024), 2) as 'INDEX_SIZE(MB)' FROM information_schema.TABLES where table_schema = 'd..