반응형

전체 글 542

[MySQL] (GIS6️⃣) 실무에서 자주 쓰는 공간 쿼리 예제 모음

MySQL의 GIS 기능은 좌표 기반 서비스를 개발할 때 강력한 도구다.하지만 공식 문서만 보고는 실무에 바로 적용하기 어렵다.이 글에서는 실제로 자주 쓰이는 공간 쿼리 예제를 정리했다.POINT 기반 매장 검색, 반경 검색, 경계 포함 여부 판단 등 다양한 상황에 대응할 수 있다.📍 1. 특정 위치에 가장 가까운 매장 찾기SELECT name, ST_Distance_Sphere(location, ST_GeomFromText('POINT(126.98 37.56)', 4326)) AS distance_mFROM storesORDER BY distance_mLIMIT 1;✅ 특정 위치에서 가장 가까운 매장을 찾는 실무에서 자주 사용됨✅ ST_Distance_Sphere는 결과를 미터 단위로 반환📍 2...

DB 2025.07.18

[MySQL] (GIS5️⃣) ST_Distance로 거리 계산하는 방법과 주의사항

MySQL의 GIS 함수 중 ST_Distance()는 두 지리 좌표 간의 직선 거리를 계산할 수 있게 해준다.하지만 예상과 달리 단위나 계산 방식이 실무와 다를 수 있어 주의가 필요하다.📐 ST_Distance()란?ST_Distance(A, B)는 두 지오메트리 객체 간의 거리(길이)를 계산한다.예:SELECT ST_Distance( ST_GeomFromText('POINT(126.9784 37.5665)', 4326), ST_GeomFromText('POINT(126.9820 37.5700)', 4326));위 쿼리는 경도 126.9784, 위도 37.5665와경도 126.9820, 위도 37.5700 사이의 거리를 계산한다.📏 결과 단위 주의 (미터 아님)많은 개발자들이 실수하는 부분이 바..

DB 2025.07.18

[MySQL] (GIS4️⃣) 공간 인덱스의 원리와 설정 방법

MySQL에서 GIS 기능을 제대로 활용하려면 공간 인덱스(SPATIAL INDEX)에 대한 이해가 필수다.📌 공간 인덱스란?공간 인덱스는 공간 데이터 검색을 빠르게 하기 위한 인덱스 구조다.일반적인 B-Tree 인덱스와는 달리, R-Tree 또는 MySQL의 내부 구조를 이용하여POINT, LINESTRING, POLYGON 타입의 위치 기반 조건을 빠르게 처리한다.🧱 기본 문법: SPATIAL INDEX 설정CREATE TABLE places ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), location POINT NOT NULL, SPATIAL INDEX(location));✅ SPATIAL INDEX는 공간 타입 컬럼에만 적용 가능✅..

DB 2025.07.18

[MySQL] (GIS3️⃣) POLYGON과 공간 포함관계 쿼리 실습

MySQL의 GIS 기능 중 하나는 영역(지역)을 나타내는 POLYGON 타입이다.이를 활용하면 매장, 구역, 지역 경계 등의 포함 여부를 SQL로 직접 판단할 수 있다.🔷 POLYGON이란?POLYGON은 다각형 형태의 영역을 정의하는 공간 데이터 타입이다.최소 3개의 꼭짓점으로 폐곡선을 만들어야 하며, 시작점과 끝점은 동일한 좌표여야 한다.예시:POLYGON((126.97 37.56, 126.98 37.56, 126.98 37.57, 126.97 37.57, 126.97 37.56))위는 서울 시청 인근 사각형 범위를 나타내는 POLYGON이다.🏗️ POLYGON 테이블 생성 및 데이터 삽입CREATE TABLE regions ( id INT AUTO_INCREMENT PRIMARY KEY, ..

DB 2025.07.18

[MySQL] (GIS2️⃣) 공간 데이터 저장 및 조회 실습: POINT, LINESTRING 활용법

MySQL에서 POINT와 LINESTRING은 가장 기본적인 공간 타입이다.이 글에서는 공간 데이터를 어떻게 저장하고, SQL로 어떻게 조회하는지 실전 위주로 정리한다.📌 실습 환경 설정MySQL 8.0 이상 버전을 사용하는 것이 권장된다.공간 인덱스와 ST_계열 함수들이 제대로 동작하려면 아래 설정을 확인하자.SHOW VARIABLES LIKE 'have_geometry';결과가 YES여야 한다.📍 POINT 데이터 저장 실습테이블 생성CREATE TABLE stores ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), location POINT NOT NULL, SPATIAL INDEX(location));✅ SPATIAL INDEX는 M..

DB 2025.07.18

[MySQL] (GIS1️⃣) GIS란? 공간 데이터 타입(POINT, POLYGON 등) 완전 정리

MySQL에서도 위치 정보, 거리 계산, 지도 기반 검색 같은 지리정보(GIS: Geographic Information System) 기능을 지원한다.그 핵심은 바로 공간 데이터 타입이다. 이번 글에선 GIS 기능을 이해하는 데 꼭 필요한 공간 타입들을 정리하고, 기본적인 구조를 알아보겠다.🌍 GIS란 무엇인가?GIS는 지리적 객체를 DB에서 표현하고 다루는 기술이다.좌표, 거리, 경로, 면적, 포함관계 등을 SQL로 처리할 수 있다.MySQL은 GIS를 지원하며 대표적인 기능은 다음과 같다:위치 좌표 저장거리 계산지역 포함 여부 판단반경 검색 (예: 2km 이내 매장 찾기)공간 인덱스를 통한 검색 최적화MySQL 5.7부터 GIS 함수들이 많이 향상되었고, MySQL 8.0 이상에서는 더 강력한 성..

DB 2025.07.18

[MySQL] (JSON6️⃣) 실무에서 JSON 타입을 쓸 때 주의할 점

MySQL의 JSON 타입은 유연하지만 실무에서는 신중하게 사용해야 한다.단순 저장엔 편리하지만, 검색, 수정, 인덱싱에서 예상 외의 문제가 자주 발생한다.⚠️ 1. JSON은 인덱스를 직접 만들 수 없다MySQL에서는 JSON 컬럼에 직접 인덱스를 걸 수 없다.즉, JSON 내부 값을 조건으로 조회하면 풀스캔이 발생할 수 있다.-- 아래 쿼리는 인덱스를 타지 않음SELECT * FROM usersWHERE JSON_EXTRACT(profile, '$.nickname') = 'hong';해결 방법은 생성 컬럼 + 인덱스 조합이다.ALTER TABLE usersADD COLUMN nickname VARCHAR(100) GENERATED ALWAYS AS (JSON_UNQUOTE(profile->..

DB 2025.07.17

[MySQL] (JSON5️⃣) JSON 쿼리 성능 튜닝 전략: 인덱싱과 최적화 팁

MySQL에서 JSON은 유연한 대신 성능 이슈를 동반한다.특히 WHERE 절에서 자주 조회하거나 JOIN에 얽히면 쿼리 속도가 급격히 느려질 수 있다.⚠️ JSON 쿼리가 느려지는 이유JSON 컬럼은 일반적인 인덱스를 직접 생성할 수 없음profile->'$.name' 같은 경로 탐색은 모든 행을 검사해야 함JSON_EXTRACT, JSON_CONTAINS는 함수 호출 비용이 크다즉, JSON 컬럼에 조건이 붙으면 인덱스가 무시되는 경우가 많다✅ 해결 전략 1: 생성 컬럼(Generated Column) 활용생성 컬럼은 JSON 내부 값을 꺼내 일반 컬럼처럼 쓰게 해준다.그리고 여기에 인덱스를 걸 수 있다.ALTER TABLE usersADD COLUMN nickname VARCHAR(100) ..

DB 2025.07.17

[MySQL] (JSON4️⃣) WHERE 절에서 JSON 조건 처리하는 방법

MySQL에서 JSON 타입을 WHERE 절에 사용하는 건처음엔 낯설지만 익숙해지면 강력한 쿼리를 만들 수 있다.✅ JSON 필드에서 특정 키가 존재하는지 확인JSON_CONTAINS_PATH() 함수를 사용해 키 존재 여부를 확인할 수 있다.SELECT *FROM usersWHERE JSON_CONTAINS_PATH(profile, 'one', '$.email');'one': 하나라도 존재하면 true'all': 모두 존재해야 true$.email: 확인할 JSON 경로✅ 유저 프로필에 특정 정보가 있는지 필터링할 때 유용🔍 특정 값이 포함됐는지 확인JSON_CONTAINS()는 배열 안에 값이 있는지, 객체에 부분 구조가 포함됐는지를 체크한다.-- 배열에 값 포함 여부SELECT *FROM prod..

DB 2025.07.17

[MySQL] (JSON3️⃣) JSON_EXTRACT, JSON_UNQUOTE, JSON_CONTAINS 파헤치기

MySQL에서 JSON 데이터를 읽고 해석하려면 JSON_EXTRACT, JSON_UNQUOTE, JSON_CONTAINS 같은 전용 함수를 잘 활용해야 한다.✅ JSON_EXTRACT: JSON 내부 값 읽기JSON_EXTRACT는 JSON 필드에서 특정 경로의 값을 추출하는 기본 함수다.연산자 -> 와 같은 역할이지만 더 명확한 문법으로 사용된다.SELECT JSON_EXTRACT('{"name":"지훈", "info":{"age":28}}', '$.info.age');-- 결과: 28JSON_EXTRACT의 특징은 결과가 JSON 형식 그대로 반환된다는 점이다.-- 문자열이 아닌 JSON 타입으로 반환됨SELECT JSON_EXTRACT('{"name":"지훈"}', '$.name');-- 결과: ..

DB 2025.07.17
반응형