쿼리 질문 드립니다.
본문
안녕하세요.
쿼리를 효율적으로 써야함을 절실히 느끼고 있는 일인입니다.
설계라 할 것도 없이 디비를 구축하고 웹을 연결해 작업을 했었는데요.
아니나 다를까 데이터가 쌓이면서 PHP 페이지에서 작업 창이 열리는 속도가 지연이 되는 문제가 발생하고 있습니다.
부득이 고수님들의 고견이 필요해 질문 드립니다.
family 라는 테이블이 있다 가정하겠습니다.
wr_id | first_name | last_name |
1 |
손자 | 김 |
2 | 민수 | 김 |
3 | 영수 | 김 |
4 | 영희 | 김 |
5 | 영은 | 이 |
6 | 영애 | 이 |
7 | 시은 | 박 |
8 | 강성 | 박 |
9 | 보라 | 박 |
한 페이지에서
select * from `family` where `last_name` = '김';
select * from `family` where `last_name` = '이';
select * from `family` where `last_name` = '박';
식으로 쿼리를 3번을 날렸는데요. 회원이 많지 않을때는 페이지 열리는데 크게 문제가 되지 않았는데요.
요즘 종종 디비에 부하가 오는지 버퍼링 시간이 길어지고 있습니다.
예전 쿼리를 select * from `family` 식으로 하나만 쓰고, PHP 단에서 array 로 풀어주는 방식을 봤던거 같은데요. 아무리 찾아봐도 보이지 않아 질문 드립니다.
고수님들의 답변 부탁드립니다.
답변 5
SELECT * FROM family WHERE last_name IN ('김', '이', '박')
// 또는
SELECT * FROM family WHERE last_name='김' OR last_name='이' OR last_name='박'
이런식으로 하시면 될텐데요.
* <- 이거 대신 사용할 칼럼만 지정하시면 조금 도움 될듯요.
그래도 느리다면 서버 사양을 높이시거나
DB테이블을 다시 설계하시거나
SQL 캐시 기능을 사용한다던가
다른 방법들을 생각해보셔야 겠네요.
!-->라스트 네임에 인덱스 걸렸나도 확인해보세요 ^^;
예뜨락님 말씀처럼 where절에 들어갈 컬럼에 인덱스를 만들어놓으면 쿼리 성능이 올라갈겁니다.
사용하지 않을 모든 데이터까지 조회해서 배열에 올린다음 거기에서 분기 시키는 것은
db에서 조회하는 비용도, 그리고 그것들을 메모리에 담는 비용도 아깝다고 생각합니다
페이징이요
원하시는 결과가 어떤 것인가를 먼저 설명하셔야 조언을 드릴 수 있습니다.