liminfo

MySQL Reference

MySQL 데이터베이스 레퍼런스

28개 결과

MySQL Reference 소개

MySQL 레퍼런스는 MySQL의 모든 필수 문법과 명령어를 여섯 가지 카테고리로 정리한 완전한 검색형 치트 시트입니다: 쿼리(SELECT/FROM/WHERE, INSERT INTO, UPDATE SET, DELETE FROM, JOIN with ON, GROUP BY/HAVING), 인덱스(CREATE INDEX, FULLTEXT INDEX, 실행 계획 분석을 위한 EXPLAIN, SHOW INDEX, ALTER TABLE ADD INDEX), 함수(IFNULL, DATE_FORMAT, JSON_EXTRACT, GROUP_CONCAT, SUBSTRING_INDEX), 스토리지 엔진(트랜잭션 지원 InnoDB, SHOW TABLE STATUS, ALTER TABLE ENGINE, SHOW ENGINES), 복제(CHANGE MASTER TO, SHOW SLAVE STATUS, START/STOP SLAVE, SHOW MASTER STATUS), 설정(SHOW VARIABLES, SET GLOBAL, SHOW PROCESSLIST, OPTIMIZE TABLE).

백엔드 개발자, 데이터 엔지니어, 데이터베이스 관리자들은 웹 애플리케이션, 전자상거래 시스템, 분석 플랫폼에서 세계에서 가장 인기 있는 오픈소스 관계형 데이터베이스인 MySQL을 사용합니다. MySQL의 InnoDB 스토리지 엔진은 고동시성 워크로드를 위한 ACID 호환 트랜잭션, 외래 키 강제, 행 수준 잠금을 제공합니다. EXPLAIN과 EXPLAIN ANALYZE 명령어는 느린 쿼리를 진단하는 데 필수적입니다 — 인덱스 사용 여부, 스캔되는 행 수, 선택된 조인 전략을 보여줍니다.

이 레퍼런스는 쿼리 최적화, INNER JOIN과 LEFT JOIN의 차이 이해, HAVING 필터가 있는 효율적인 GROUP BY 쿼리 작성, 읽기 확장과 백업을 위한 마스터-슬레이브 복제 설정, JSON 컬럼 쿼리를 위한 JSON_EXTRACT 사용, innodb_buffer_pool_size와 max_connections 같은 전역 변수 튜닝에 특히 유용합니다. 각 항목에는 현실적인 테이블과 컬럼 이름을 사용한 완전한 SQL 예제가 포함됩니다.

주요 기능

  • 6개 카테고리: 쿼리, 인덱스, 함수, 스토리지 엔진, 복제, 설정
  • 핵심 DML 쿼리: ORDER BY/LIMIT이 있는 SELECT, INSERT INTO, UPDATE SET, DELETE FROM, INNER/LEFT JOIN
  • 집계 조건 필터링을 위한 HAVING이 있는 GROUP BY(COUNT, SUM, AVG)
  • 인덱스 관리: CREATE INDEX, CREATE FULLTEXT INDEX, EXPLAIN/EXPLAIN ANALYZE, SHOW INDEX, ALTER TABLE ADD INDEX/UNIQUE
  • 내장 함수: IFNULL(NULL 처리), DATE_FORMAT(날짜 포맷), JSON_EXTRACT(JSON 컬럼), GROUP_CONCAT, SUBSTRING_INDEX
  • 스토리지 엔진 비교: InnoDB(트랜잭션·FK·행 잠금) vs MyISAM, SHOW TABLE STATUS 및 ALTER TABLE ENGINE 포함
  • 복제 설정: 로그 파일/위치를 사용하는 CHANGE MASTER TO, SHOW SLAVE STATUS, START/STOP SLAVE, SHOW MASTER STATUS
  • 서버 관리: LIKE 패턴이 있는 SHOW VARIABLES, 실시간 튜닝용 SET GLOBAL, SHOW PROCESSLIST, OPTIMIZE/ANALYZE TABLE

자주 묻는 질문

MySQL에서 WHERE와 HAVING의 차이는 무엇인가요?

WHERE는 그룹화 전에 행을 필터링합니다 — 기본 테이블의 개별 행에 적용됩니다. HAVING은 GROUP BY 집계 후에 그룹을 필터링합니다 — COUNT(*), SUM(amount) 같은 집계 함수를 참조할 수 있습니다. 예: SELECT department, COUNT(*) as cnt FROM employees GROUP BY department HAVING cnt > 5 — HAVING 절은 직원이 5명 이하인 부서를 그룹화된 결과에서 필터링합니다.

느린 MySQL 쿼리를 EXPLAIN으로 어떻게 분석하나요?

SELECT 앞에 EXPLAIN을 붙이면 실행 계획을 볼 수 있습니다: EXPLAIN SELECT * FROM users WHERE email = "test@test.com". "type" 컬럼을 확인하세요 — "ref" 또는 "range"는 인덱스를 사용한다는 의미(좋음)이고, "ALL"은 전체 테이블 스캔(나쁨)을 의미합니다. "rows" 컬럼은 검사될 예상 행 수를 보여줍니다. MySQL 8.0+에서는 EXPLAIN ANALYZE를 사용하면 실제 행 수와 실행 시간을 포함한 실제 실행 통계를 볼 수 있습니다.

MySQL에서 INNER JOIN과 LEFT JOIN의 차이는 무엇인가요?

INNER JOIN은 양쪽 테이블에 일치하는 레코드가 있는 행만 반환합니다. LEFT JOIN은 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환합니다 — 오른쪽 테이블에 일치하는 것이 없는 행은 오른쪽 테이블 컬럼에 NULL 값이 들어갑니다. 관계가 있는 레코드만 원할 때는 INNER JOIN을, 관련 레코드 존재 여부와 무관하게 주 테이블의 모든 레코드를 원할 때는 LEFT JOIN을 사용하세요.

MySQL에서 GROUP_CONCAT은 어떻게 동작하나요?

GROUP_CONCAT은 그룹 내 여러 행의 값을 하나의 문자열로 연결합니다. 예: SELECT department, GROUP_CONCAT(name ORDER BY name SEPARATOR ", ") FROM employees GROUP BY department. 이렇게 하면 부서별로 모든 직원 이름이 쉼표로 구분된 문자열로 하나의 행에 반환됩니다. ORDER BY로 순서를 제어하고 구분자를 변경할 수 있습니다. 결과는 group_concat_max_len 변수(기본값 1024바이트)로 제한됩니다.

InnoDB와 MyISAM 스토리지 엔진의 차이는 무엇인가요?

InnoDB는 MySQL 기본 엔진으로 ACID 트랜잭션(BEGIN/COMMIT/ROLLBACK), 외래 키 제약, 고동시성을 위한 행 수준 잠금, 크래시 복구를 지원합니다. MyISAM은 트랜잭션이나 외래 키를 지원하지 않고 테이블 수준 잠금을 사용하여 동시 쓰기 부하에서 느리지만, 비트랜잭션 워크로드에서 읽기가 빠릅니다. 특별한 이유가 없다면 새 애플리케이션에는 InnoDB를 사용하는 것이 좋습니다.

MySQL에서 전문 검색을 위한 FULLTEXT 인덱스는 어떻게 만드나요?

텍스트 컬럼에 FULLTEXT 인덱스를 생성합니다: CREATE FULLTEXT INDEX idx_content ON articles (title, body). 그런 다음 검색합니다: SELECT * FROM articles WHERE MATCH(title, body) AGAINST("검색어"). MySQL의 FULLTEXT 검색은 기본적으로 자연어 모드를 사용하지만, +(필수)와 -(제외) 연산자를 위한 불리언 모드(AGAINST("term" IN BOOLEAN MODE))도 지원합니다. FULLTEXT 인덱스는 MySQL 5.6+에서 InnoDB 테이블에서 지원됩니다.

MySQL 마스터-슬레이브 복제는 어떻게 설정하나요?

레플리카에서 CHANGE MASTER TO를 실행하여 SHOW MASTER STATUS에서 얻은 프라이머리 서버의 호스트명, 복제 사용자, 비밀번호, 바이너리 로그 파일명, 위치를 지정합니다: CHANGE MASTER TO MASTER_HOST="primary.example.com", MASTER_USER="repl", MASTER_PASSWORD="password", MASTER_LOG_FILE="mysql-bin.000001", MASTER_LOG_POS=154. 그런 다음 START SLAVE를 실행하여 복제를 시작합니다. SHOW SLAVE STATUS\G로 모니터링하여 Seconds_Behind_Master와 오류 메시지를 확인하세요.

SET GLOBAL로 MySQL 성능을 어떻게 튜닝하나요?

재시작 없이 런타임에 서버 변수를 변경하려면 SET GLOBAL을 사용하세요: SET GLOBAL max_connections = 500은 연결 한도를 늘리고, SET GLOBAL innodb_buffer_pool_size = 4294967296은 InnoDB 버퍼 풀에 4GB를 할당합니다(읽기 집약적 워크로드에서 가장 효과적인 설정). SHOW VARIABLES LIKE "innodb%"로 현재 InnoDB 설정을 확인하세요. SET GLOBAL 변경 사항은 MySQL 재시작 후 사라지므로 영구적으로 적용하려면 my.cnf에 추가하세요.