mysql 튜닝은 어떻게해야하나요?

기존 개발자가 테이블 생성을 하고 1년간 운영을 했다가 이번에 인수인계를 받게됐습니다. 기존 개발자가 만들어놓은 테이블을 조인 걸다보면 쿼리가 너무 느려지는데 튜닝방법은 어떻게 찾아보는게 좋을까요??

    8개의 답변이 있어요!

    • 안녕하세요.

      명령어를 쭉 나열할순없고, 해당 SQL 문제를 확인하고 튜닝하는 가이드만 해드릴게요.

      1.MYSQL 사용하시는툴 EXPLAN(실행계획)을 확인한다.

      >>> 툴이 없거나 실행계획 확인방법을 모른다면 네이버에 MYSQL PLAN 으로 치고 검색해보세요.

      2. Plan 에서 index scan이 아닌 table full scan 구간이 있는지 확인한다.

      3-1 조인걸다보니 느려진다고 하는거로 추측해보면 조인하는대상테이블 끼리 조인키가 인덱스로 되어져있는지 확인

      3-2 조인키가 인덱스로 있다면, 조인하는방식이 nl,merge join,hash 인지 보고 방식변경

      4. 위의 내용을 확인해보고 적합한 인덱스 생성 또는 hint 적용

      해결 구간중에 모르는 부분은 위에 쓴글 기반으로 네이버 검색하면 좀더 상세히 가이드가 나올꺼예요. ^^

      찾아가면서 문제해결하면 실력도 같이 상승하실겁니다!

    • 일단 테이블 튜닝은 기본적으로 쿼리 튜닝과 인덱스 설정과 파티셔닝이 제대로 되어 있는지를 먼저 보시면 됩니다.

      이력 테이블인 경우 월단위, 데이터 양이 많다면 일단위로 파티션을 만들어주시는게 좋죠.

      그 다음으로 조회 조건에 맞는 인덱스 설정이 잘 되어 있는지, 테이블 어날라이즈는 주기적으로 되고 있는지를 봐주시면 됩니다.

    • 튜닝을 하려면 가장 많이 쓰는 쿼리에 PK또는 인덱스가 제대로 잡혀 있는지를 보는 부분이 가장 중요한 것 같습니다. 그리고 쿼리 조회시에 EMPNO = 10 이라는 구문같은게 있을 경우 오른쪽에 있는 10을 수정하는 것은 크게 문제가 되지 않으나 EMPNO와 같은 컬럼등을 함수를 쓰는 등의 행위를 하면 크게 느려 질수 있고 되도록이면 LIKE문등을 사용하지 않으시는 것이 좋습니다. 또한 JOIN이 걸려 있을 경우 JOIN조건이 하나라도 빠진 것이 없는지 보는 것도 중요합니다.

    • 안녕하세요. 아하(a-ha) 프로그래밍 지식 답변자 입니다.

      MySQL 의 쿼리가 느려지는 이슈로 인해 어떻게 튜닝을 해야 하는지 질문을 주셨네요.

      우선 어떤 부분에서 문제가 발생하는지 자세히는 모르므로 어떻게 추적을 해야하는지 추천 드리겠습니다.

      먼저 쿼리가 느려지는 이슈 이므로 슬로우 쿼리 로그를 활성화 해야 합니다.

      https://zetawiki.com/wiki/MySQL_%EC%8A%AC%EB%A1%9C%EC%9A%B0_%EC%BF%BC%EB%A6%AC_%EB%A1%9C%EA%B7%B8_%EC%84%A4%EC%A0%95

      원인을 찾았으면 서버 매개변수 수정, 혹은 쿼리 수정으로 대응을 해야 합니다.

      답변이 도움이 됐으면 좋겠습니다. 좋은 하루 되세요!

    • 안녕하세요

      mysql 튜닝 방법에 대해 문의해주셨는데요

      일단 조건절에 들어가는 값을 인덱스 걸수있는지

      확인해보시고 join쿼리를 만들때

      데이터량이 적은 테이블 순으로 참조하도록

      쿼리를 작성하셔야합니다

      혹시 조건절에 형변환 하는 구문이 들어가있다면

      테이블 설계를 같은타입으로 변경하는것도

      방법일듯 합니다

      문의하신 내용에 도움됐으면 좋겠습니다

      감사합니다

    • 다양한 방법이 있습니다.

      저도 쿼리 전문가가 아닌 프론트엔드 개발자 이기 때문에 기본적으로 수정하는 방법 밖에는 모릅니다.

      보통 실행계획을 참고하여 어떤 데이터를 읽을 때 시간이 많이 소모 되는지 확인 하고 그 쪽 수정해주면 되는데

      index를 만들어 해당 index로 where 자동으로 잘 타지게끔 수정 합니다.

      그리고 특히 조인걸 때 on 절에 a.a = b.a 이런 조인 외에 a.a = '33' 이런식으로 보통 where 절에서 사용 하는 것들을

      on절에 넣으면 속도가 엄청 느려집니다. 쿼리가 길더라도, 최대한 옵티마이저가 (오라클기준) 어떤 계산방식으로 데이터를

      땡겨올지 길을 잘 다듬어 준다고 생각하면 됩니다.

      쿼리튜닝은 생각보다 어려운 편이라 따로 전문가가 있을 정도입니다.

    • 구체적인 상황, 케이스에 대해서 올려주시면 더 많은 도움을 받으실 수도 있을 것 같아요!

      최근에 저도 MySql에 대해 좀 더 공부해보려고 Real Mysql 이라는 책을 보게 됐는데, 다루는 내용이 정말 방대하더라구요 😂

      쿼리 실행계획이나 최적화 방법에 대해서도 쿼리 종류별로 나와있으니 참고해보시면 좋을 것 같아요

      참고로 페이지가 1,000페이지가 넘는 두꺼운 책이라서.. 정독을 하신다는 느낌보다는 원하시는 내용만 필요하실 때 찾아보는 느낌으로 보면 상당히 괜찮더라구요!

      다만 아쉬운점은 E-book이 아직 없어서 아주 가끔 가지고 다닐 때 고통스럽다는 점 정도..? 있습니다 😇

      책 링크는 구글에 바로 검색하시면 바로 나오시겠지만.. 편의를 위해서 링크 걸어드릴게요!

      http://www.yes24.com/Product/Goods/6960931

    • 처음은 우선 쿼리에 사용되는 테이블 별로 인덱스 구성을 먼저 확인 하신 후

      쿼리의 조회조건과 각 테이블 별로 조인하는 조건이 각 테이블에 인덱스로 잘 잡혀있는지 확인하는 것이 첫 번째로 수행되어야 할 것 같습니다.

      그 후 조건에 따라 사용할 수 있는 인덱스가 존재하지 않는 경우 추가로 생성하는 것도 하나의 방법이 될 수 있습니다.

      무분별한 인덱스 생성은 문제가 되지만 조회 조건에 자주 이용되는 컬럼들은 인덱스를 생성하는 것이 좋습니다.