박스무스
134
2019-07-24 19:57:52 작성 2019-07-24 19:58:24 수정됨
12
1720

데이터베이스 서버 안 터지게 조심하는 방법?


안녕하세요. 근래에 취업하여 열심히 성장하려 노력중인 PHP 신입 개발자입니다.


부족한 실력에 질문 글 쓰거나, 답글 쓰는 게 좋지 못한 것 같아서 항상 눈팅 위주로 하다가 질문 글 올려봅니다.


서비스 중인 웹의 데이터베이스에 쿼리를 날릴 때, 데이터베이스가 방대하면, 서브쿼리 포함하는 select 질의 만으로도 데이터베이스 서버가 죽어버리더라구여.


이 정도 쿼리로 설마 데이터베이스가 죽겠어? 했는데 정말 죽어서 너무 난처했습니다... 감사하게도 사수분이 잘 해결해주셨어요. 회사 분들도 다들 좋은 분들이라 질책도 안 하시고...


학생때는 실 서비스중인 대규모 웹에서 작업할 일 없이, 항상 개인 서버에다가 마구잡이로 쿼리 던져보고 에러와 부딪히며 코딩했었는데, 실무에서 그렇게 하면 큰 일 날 수도 있다는 걸 배운 귀중한 경험이었습니다.


일 터졌을 때, 머리가 새하얘져서 사태가 수습된 후에도 자신감 결여와 두려움에 개발속도가 하나도 안 붙더라구여. 괜히 로컬서버에다가 더미데이터 넣어서 질의해보고... 


서론이 길었는데, 앞으로는 데이터베이스 서버가 터지지 않게 조심하고 싶습니다. 제가 찾아보고 조금 생각한 방안은 다음과 같습니다. (Create Update Insert Delete등은 아직 신입이 건드리기엔 조심스러운 부분이라 논외로...)


1. 큰 규모의 데이터베이스에 질의를 할 때는 항상 limit를 건다

2. 서브쿼리를 사용하게 될 때는 로컬 데이터베이스의 더미데이터로 실험하여, 수행속도를 꼭 확인한다

3. 혹시라도 실 서버에 Select 질의를 했는데 응답이 느리다 싶으면 PhpMyAdmin에 show processlist 명령어를 치고 내가 질의한 쿼리를 kill한다


우선 이렇게 정해두면 위험부담이 많이 줄어들까요??


사실 데이터베이스 자체를 덤프떠서 제 로컬에 생성하고 실험해보고 싶은데, 정보보호법의 문제도 있고, 또 그 많은 데이터를 뽑아서 덤프뜨려고 할 때 데이터베이스가 죽어버릴까봐 무서워서 못하겠습니다...


보통은 어떻게들 하시나요??


인생 쉬운 일이 하나 없는 것 가타요..... 흑


 


3
  • 답변 12

  • 더미
    15k
    2019-07-24 20:08:55

    우선 개발 db가 없는게 충격적입니다..

  • 동대
    1k
    2019-07-24 20:26:50 작성 2019-07-24 20:27:50 수정됨

    phpmyadmin을 쓰지말고 다른 디비툴을 사용하세요. 

    import, export 뭘 해도 타임리미트, 메모리리미트 걸리실껄요? 그리고 신입이 수준에서 짜야 할 쿼리가 join으로 해결이 안 되고 subquery까지 사용을 해야하나요?

  • 박스무스
    134
    2019-07-24 20:32:23 작성 2019-07-24 20:33:22 수정됨

    동대님 헤이디SQL 써보겠습니다!!!


    그리고 서브쿼리 써야하는가? 물어보신 거에 대한 대답은... 그렇다 입니당.

    데이터베이스 터트린 뒤에 사수 분하고 쿼리문 얘기 잠깐 했는데 서브쿼리 써야하긴 하는 거 같다고 하셔서... 이래저래 머리 열심히 굴려보고 있는데 질의 날리기가 무서워요 ㅜㅜ

  • 동대
    1k
    2019-07-24 20:41:35

    박스무스 //

    안 그래도 그거 추천은 드릴려고 했는데 찾으셨네요. 그리고 셀렉트 진짜 이상하게 짠걸 소스로 적용시키고 그게 트래픽이 많은 페이지나 API면 모를까 단순히 1번 질의 날려서 디비가 죽지는 않습니다. 

  • 박스무스
    134
    2019-07-24 20:45:31

    동대//

    이상한 질의라도 던져보고 나서 이상하게 찍힌 값 보고 고쳐가는 게 너무 습관화된 것 같아요... 이제부터라도 때려맞추기 식으로 쿼리 던지지 않고, 고심한 후에 질의 날려보겠습니다. 답변 감사합니다!! 

  • 동대
    1k
    2019-07-24 20:56:41

    박스무스 // 

    제가 상황을 모르고 드리는 말일 수 있는데  서브쿼리 너무 남발하지 마세요. 정말 필요할 때만 써야지 조인 개념 자체를 몰라서 서브쿼리 사용하고 있는 개발자 몇번 본 적 있습니다. 조인에 대해서는 그냥 긴 말 안하고 링크로...

    https://www.opentutorials.org/course/3161/19545

  • 박스무스
    134
    2019-07-24 21:09:11

    동대 //

    ㅎㅎ 생활코딩 이고잉님 영상이네요!! 검색 열심히 해보면서 JOIN만으로 해결 가능한지 곰곰히 생각해보겠슴다

  • ISA
    5k
    2019-07-24 21:16:57

    좋은 고민입니다.

  • 동대
    1k
    2019-07-24 21:29:00 작성 2019-07-24 21:30:09 수정됨

    박스무스 // 

    신입 시절에는 서브쿼리던 조인이던 뭐가 됬든간에 일단 원하는대로 기능만 만들 수 있으면 좋겠다가 현실이죠. 상황에 따라서 서브쿼리, 조인 어떤게 정확한 정답일지는 모릅니다. 


    쿼리가 느릴 땐 다양한 방법이 있습니다. where 절을 추가로 하는 것으로 끝나는(?) 상황도 있고 통계 값을 위해서는 스케쥴링으로 주기마다 통계용 테이블에 데이터를 수집한다던지 키워드 검색에서 인덱스만으로는 이제 도저히 처리 불가능해서 따로 검색 서버를 둔다던가 짧은 쿼리로 리턴해서 어플리케이션 서버에서 이 두개를 조합한다던가.. 


    제가 나열한 방법중에서 상황에 따라 오답인 경우도 있고 사용할 수 없는 경우도 있습니다. 검색 서버의 경우 실시간으로 추가되는 데이터를 검색해야한다는 경우에는.. 검색 서버의 경우 사람마다 용어가 조금 다르던데 어떤 오픈소스에서 자기들 홈페이지에 Search server라고 표현하여 검색 서버라고 적었습니다. 


    검색서버라는게 어떤건지 궁금하시다면 apache solr,  sphinxsearch, Elasticesearch 라는 키워드로 검색을 해보시면 될꺼 같네요. 댓글 계속 다는건 DB쪽 개판친거 수습하러 많이 들어가봐서[...] ㅠㅠ

  • 박스무스
    134
    2019-07-24 21:40:45

    ISA // 감사합니다!

    동대 //

    키워드들 알려주셔서 감사합니다

    학생 때, 자격증 준비할 때 나름 데이터베이스 설계니 이론이니 해봤다고 생각했는데

    정말 겉핥기였다는 걸 실감하고 있어요

    데이터베이스 관리자 이런게 괜히 있는게 아니구나 싶고..... 열심히 공부해보겠습니다 :)

  • 곱창
    371
    2019-07-24 22:26:09

    explain부터 확인한다.

    그리고 mysql 인것 같은데 mysql은 서브쿼리에 너무나도 미친듯이 욕나오게  취약합니다.

  • Dive_Drink_Develope
    6k
    2019-08-30 09:42:30

    explain부터 확인한다.2

  • 로그인을 하시면 답변을 등록할 수 있습니다.