MySQL과 PostgreSQL 비교
데이터 저장
열과 스키마 결정은 데이터가 프로덕션에 들어간 뒤에는 되돌리기 어렵습니다. 이 가이드들은 열 유형, 기본 키 전략, 제약 조건, 그리고 VillageSQL의 확장 프레임워크가 가능하게 하는 유형(네이티브 UUID와 네트워크 주소 유형 같은)을 다룹니다.- UUID를 효율적으로 생성하고 저장하는 방법
- 자동 증가, UUID, 복합 키 중에서 선택하는 방법
- IPv4와 IPv6 주소를 효율적으로 저장하는 방법
- MySQL에 MAC 주소를 저장하고 쿼리하는 방법
- VillageSQL로 IPv6 주소를 네이티브로 처리하는 방법
- JSON 문서를 저장하고, 쿼리하고, 조작하는 방법
- 데이터에 맞는 열 유형을 고르는 방법
- TINYINT(1) 대신 진짜 불리언을 저장하는 방법
- 문자 집합과 콜레이션이 데이터에 미치는 영향
- MySQL 타임스탬프로 시간대를 올바르게 처리하는 방법
- 데이터베이스 정규화로 스키마를 구성하는 방법
- 외래 키로 참조 무결성을 강제하는 방법
- 생성 열로 파생 값을 계산하고 인덱스하는 방법
- CHECK 제약 조건으로 데이터베이스 수준에서 데이터를 검증하는 방법
- deleted_at 열로 소프트 삭제를 구현하는 방법
- utf8mb4로 이모지와 완전한 유니코드를 저장하는 방법
쿼리 작성
이 가이드들은 JOIN과 집계부터 윈도우 함수, CTE, 전문 검색까지 가장 자주 쓰게 될 SQL을 다룹니다. VillageSQL 전용 가이드에는 IP 서브넷으로 쿼리하기와 HTTP 및 AI 함수로 결과 보강하기가 있습니다.- 느리거나 잘못된 JOIN을 바로잡는 방법
- 서브쿼리와 JOIN 중에서 결정하는 방법
- CTE가 도움이 되는지 해가 되는지 판단하는 방법
- 느린 GROUP BY를 빠르게 만드는 방법
- 윈도우 함수로 누적 합계, 순위, 이동 평균을 계산하는 방법
- MySQL에서 NULL이 동작하는 방식과 올바르게 다루는 방법
- MySQL에서 전문 검색을 구현하는 방법
- 뷰로 복잡한 쿼리를 단순화하는 방법
- UPSERT로 문 하나에서 행을 삽입하거나 업데이트하는 방법
- 키셋과 OFFSET 페이지네이션으로 큰 결과 집합을 나누는 방법
- SQL에서 문자열을 조작하고 변환하는 방법
- MySQL 쿼리에서 날짜와 시간을 다루는 방법
- MySQL에서 IP 서브넷으로 쿼리하고 필터링하는 방법
- MySQL에서 IP 주소로 지리 위치를 조회하는 방법
- MySQL에서 직접 HTTP 요청을 보내는 방법
- 외부 REST API의 데이터로 쿼리 결과를 보강하는 방법
- cube 유형으로 다차원 데이터를 저장하고 쿼리하는 방법
- MySQL에서 트라이그램 유사도로 비슷한 문자열을 찾는 방법
- MySQL에서 이름을 음성과 편집 거리로 매칭하는 방법
데이터 보안
VillageSQL의 crypto 확장은 bcrypt, AES 암호화, HMAC 서명, 다이제스트 함수를 SQL로 가져옵니다. 이 가이드들은 그 암호화 함수와 함께 MySQL 내장 사용자 및 권한 관리를 다룹니다.- bcrypt와 Argon2로 비밀번호를 안전하게 해싱하는 방법
- 데이터 무결성을 위한 체크섬과 다이제스트를 생성하는 방법
- 데이터베이스 수준에서 민감한 열 데이터를 암호화하는 방법
- MySQL에서 AES로 데이터를 암호화하고 복호화하는 방법
- MySQL에서 HMAC으로 데이터에 서명하고 검증하는 방법
- 암호학적으로 안전한 랜덤 값을 생성하는 방법
- MySQL 사용자와 권한을 만들고 관리하는 방법
- 사용자가 비밀번호 대신 JWT로 로그인하게 하는 방법
- 프로덕션을 위해 MySQL 서버 보안을 강화하는 방법
성능 최적화
느린 쿼리는 보통 인덱스나 스키마 문제입니다. 이 가이드들은 EXPLAIN 출력, 슬로우 쿼리 로그, InnoDB가 데이터를 저장하는 방식에 대한 이해로 느린 쿼리를 진단하는 방법과 무엇을 바꿔야 하는지 다룹니다.- 느린 MySQL 쿼리를 진단하고 고치는 방법
- 인덱스의 동작 방식과 사용 시점
- MySQL EXPLAIN 출력을 읽고 조치하는 방법
- 커버링 인덱스가 테이블 조회를 없애는 방식
- 슬로우 쿼리 로그로 느린 쿼리를 찾고 고치는 방법
- 연결 풀링으로 데이터베이스 연결을 효율적으로 관리하는 방법
- InnoDB가 데이터를 저장하는 방식과 그것이 성능에 중요한 이유
- 대량의 데이터를 빠르게 삽입하는 방법
- 더 나은 쿼리 성능을 위해 큰 테이블을 파티셔닝하는 방법
AI로 구축
VillageSQL의 AI 확장은 SQL에서 직접 언어 모델을 호출하고 임베딩을 생성하게 해 줍니다. 이 가이드들은 제공자 설정과 실제 쿼리에서ai_prompt()와 ai_embedding()을 사용하는 방법을 다룹니다.
- VillageSQL을 위한 AI 제공자 자격 증명을 구성하는 방법
- ai_prompt()로 SQL에서 직접 AI 모델을 호출하는 방법
- MySQL에서 벡터 임베딩을 생성하고 저장하는 방법
- MySQL 안에서 AI로 텍스트를 분류하는 방법
- MySQL에서 AI 함수로 감성 분석을 실행하는 방법
- SQL에서 직접 AI로 텍스트를 요약하는 방법
- MCP로 AI 에이전트를 MySQL에 연결하는 방법
MySQL 운영
이 가이드들은 운영 측면을 다룹니다: 스키마 마이그레이션, Docker 설정, 트랜잭션, 복제, 백업, 그리고 프로덕션에서 문제가 생겼을 때 해야 할 일입니다.- 최소한의 중단으로 MySQL을 업그레이드하는 방법
- 지원 종료 후 MySQL 8.0을 8.4로 업그레이드하는 방법
- PostgreSQL에서 MySQL로 마이그레이션하는 방법
- MariaDB에서 MySQL로 마이그레이션하는 방법
- 프로덕션에서 스키마 변경을 안전하게 관리하는 방법
- 중단 없이 라이브 테이블에 ALTER TABLE을 실행하는 방법
- MySQL을 위해 Django, Rails, Prisma를 구성하는 방법
- 로컬 개발과 프로덕션을 위해 Docker에서 MySQL을 실행하는 방법
- Testcontainers로 실제 MySQL 서버를 대상으로 테스트하는 방법
- Kubernetes에서 MySQL을 실행하는 방법
- 트랜잭션으로 데이터를 일관되게 유지하는 방법
- 교착 상태를 감지하고, 예방하고, 복구하는 방법
- 가장 흔한 MySQL 오류를 고치는 방법
- MySQL에서 스토어드 프로시저를 작성하고 사용하는 방법
- MySQL 트리거로 동작을 자동화하는 방법
- MySQL 트리거에서 웹훅을 보내는 방법
- INFORMATION_SCHEMA로 MySQL 메타데이터를 쿼리하는 방법
- MySQL 데이터베이스를 백업하고 복원하는 방법
- MySQL 복제의 동작 방식과 설정 방법
- MySQL 읽기 복제본으로 읽기를 확장하는 방법
- 바이너리 로깅의 동작 방식과 특정 시점 복구에 사용하는 방법
애플리케이션 연결
모든 프레임워크는 MySQL에 조금씩 다르게 접근합니다. 이 가이드들은 각각 라이브 서버를 대상으로 작은 동작하는 애플리케이션을 만들고, 처음에 틀리기 쉬운 설정 단계를 다룹니다: 드라이버 선택, 마이그레이션, 연결 풀링, 그리고 풀이 있어야 하는 위치입니다.- Prisma로 Next.js를 MySQL에 연결하는 방법
- Drizzle로 Next.js를 MySQL에 연결하는 방법
- ORM 없이 Next.js를 MySQL에 연결하는 방법
- SQLAlchemy 2.0으로 FastAPI를 MySQL에 연결하는 방법
- Eloquent로 Laravel을 MySQL에 연결하는 방법
- ActiveRecord로 Rails를 MySQL에 연결하는 방법
- sqlc로 Go에서 타입 안전한 MySQL 쿼리를 생성하는 방법
- 서버리스 런타임이 MySQL 연결을 고갈시키지 않게 하는 방법
- MySQL 테이블을 REST API로 공개하는 방법