소프티어 부트캠프 프로젝트 중 주로 데이터베이스 관련 개발을 도맡아 하면서 쿼리 성능 개선에 도전하였고 그 과정들을 정리해봄
깃헙 링크 : https://github.com/softeerbootcamp/Team1-TDD
create table locations
(
id bigint auto_increment primary key,
location POINT not null,
post_id bigint not null,
foreign key (post_id) references posts (id) on update cascade on delete cascade
);
SELECT location FROM locations;
SELECT ST_AsText(location) FROM locations;
SELECT ST_X(location) AS longitude, ST_Y(location) AS latitude
FROM locations;
SELECT p.id FROM posts p
JOIN options o ON p.mycar_id = o.mycar_id
JOIN mycars m ON p.mycar_id = m.id
JOIN cars c ON m.car_id = c.id
JOIN appointments a ON p.id = a.post_id
JOIN locations l ON p.id = l.post_id
WHERE o.name IN ('2WD', '현대 스마트 센스')
AND c.id = 1
AND a.date IN('2023-02-22','2023-02-23','2023-02-25','2023-03-01','2023-03-02','2023-03-03', '2023-03-25')
AND l.latitude BETWEEN '36.2' AND '36.4'
AND l.longitude BETWEEN '127.2' AND '128'
AND a.status = 'PENDING'
GROUP BY p.id HAVING COUNT(DISTINCT o.name) = 2;
SELECT p.id FROM posts p
JOIN options o ON p.mycar_id = o.mycar_id
JOIN mycars m ON p.mycar_id = m.id
JOIN cars c ON m.car_id = c.id
JOIN appointments a ON p.id = a.post_id
JOIN locations l ON p.id = l.post_id
WHERE o.name IN ('2WD', '현대 스마트 센스')
AND c.id = 1
AND a.date IN('2023-02-22','2023-02-23','2023-02-25','2023-03-01','2023-03-02','2023-03-03', '2023-03-25')
AND ST_Contains(ST_MakeEnvelope(Point(127.2, 36.2), Point(128, 36.4)), l.location)
AND a.status = 'PENDING'
GROUP BY p.id HAVING COUNT(DISTINCT o.name) = 2;
create table locations
(
id serial
primary key,
location geometry not null,
geom geometry
);
create index loc_idx
on locations using gist (geom);
ST_INTERSECTS는 두 GEOMETRY 객체가 공유하는 부분이 있을 때 1을 반환하는 함수이다. GEOMETRY 인자로 GEOMETRYCOLLECTION 타입이 올 경우에는 런타임 에러를 발생시킨다.
구성요소 | 설명 |
---|---|
geom1 | GEOMETRY 객체를 나타내는 GEOMETRY TYPE이어야 한다. |
geom2 | GEOMETRY 객체를 나타내는 GEOMETRY TYPE이어야 한다. |
EXPLAIN ANALYZE
SELECT * FROM locations
WHERE ST_Intersects(geom, ST_MakeEnvelope(127.0, 35.0, 128.0, 36.4, 4326));
→ 평균 속도 : 0.08 sec
ST_CONTAINS는 GEOMETRY 객체 2가 GEOMETRY 객체 1의 외부에 존재하지 않고, 객체 1의 내부에 하나 이상의 포인트가 존재할 때만 1을 반환하는 함수이다. 두 GEOMETRY 객체 모두 GEOMETRY 객체가 아니어야 한다.
구성요소 | 설명 |
---|---|
geom1 | 포함하는 GEOMETRY 객체를 나타내는 GEOMETRY TYPE이어야 한다. |
geom2 | 포함되는 GEOMETRY 객체를 나타내는 GEOMETRY TYPE이어야 한다. |
EXPLAIN ANALYZE
SELECT * FROM locations
WHERE ST_Contains(ST_MakeEnvelope(127.0, 35.0, 128.0, 36.4, 4326), geom);
→ 평균속도 : 0.04 sec