Skip to content

MariaDB

Yongho Choi edited this page Jan 22, 2017 · 1 revision

성능 향상

MySQL 서버의 전통적인 연결 및 처리 방식

  • 하나의 클라이언트가 접속할 때마다 그 클라이언트만을 위한 전용 스레드 생성
  • 스레드가 많아질 수록 경합이 심해지고 자연히 성능이 떨어짐
  • 스레드가 Idle 상태이든 Running 상태이든 상관없이 사용자 수만큼 스레드가 생성

MariaDB의 스레드 풀

  • 스레드 풀의 스레드 수는 동적으로 관리
    • 필요한 경우 자동으로 개수가 증가/감소
  • 스레드 풀 자체의 관리 비용이 상당히 낮다.
  • 기본적으로 운영체제가 지원하는 스레드 풀을 사용. 그 외에는 I/O 멀티플렉싱 방법 사용
    • Windows : Native 스레드 풀 기능 활용
    • Unix/Linux : MariaDB에서 직접 스레드 풀 구현.
      • threadpool_min_threads
  • 스레드의 최대 개수를 제한하여 시스템의 자원 사용률을 제한.
  • 실제 처리하고 있는 커넥션만 스레드를 유지하고, Idle 상태인 커넥션은 커넥션 정보만 가지고 있다.
  • 특정 사용자가 쿼리를 실행하면 MariaDB 서버는 스레드 풀에서 여유 스레드가 있는지 확인하고 할당한다.
  • 스레드 풀의 유휴 스레드가 많을 경우 일정한 규칙에 의해서 제거한다.
  • 쿼리 요청이 폭발적으로 늘어났다가 다시 부하가 거의 없는 상태로 돌아오는 과정이 반복되는 경우 스레드 풀이 비효율적으로 작동할 수 있다.
    • 시스템 변수를 조절하여 해결
      • unix계열 : thread_pool_idle_timeout
      • windows 계열 : thread_pool_min_threads
  • 스레드 풀이 활성화 되면 자동적으로 MariaDB의 스레드 캐시가 비활성화된다.

MariaDB 관리 및 진단

  • SHOW EXPLAIN FOR

    • 클라이언트의 요청을 처리하고 있는 스레드가 실행 중인 쿼리의 실행계획 확인

      > show processlist
      > show explain for 1
      > show warnings
      
  • 슬로우 쿼리

    • my.cnf 파일에 slow-query-log 설정
    • 쿼리 실행 시간과 수행 쿼리 뿐만 아니라 실행계획까지 함께 출력
    • log_slow_verbosity 변수 제공
  • explain 명령으로 실행계획 확인

    MariaDB [hive]> explain select * from AccountInfo;
    +------+-------------+-------------+------+---------------+------+---------+------+------+-------+
    | id   | select_type | table       | type | possible_keys | key  | key_len | ref  | rows | Extra |
    +------+-------------+-------------+------+---------------+------+---------+------+------+-------+
    |    1 | SIMPLE      | AccountInfo | ALL  | NULL          | NULL | NULL    | NULL |    4 |       |
    +------+-------------+-------------+------+---------------+------+---------+------+------+-------+
    
    • id : 구문에 따라 순차적으로 부여된 번호
    • select_type : 간단한 쿼리인지 복잡한 쿼리인지 구분
      • SIMPLE : union이나 서브쿼리가 없는 경우
      • SUBQUERY : FROM 절에 있는 서브쿼리가 아닌 SELECT 절에 나타나는 서브쿼리인 경우
      • DERIVED : FROM 절의 서브쿼리인 경우
      • UNION : UNION을 사용한 쿼리인 경우
      • UNION_RESULT : UNION의 결과 값이 임시 테이블에 저장되며 그 임시테이블을 표현할 때 사용
    • table : 접근한 테이블명
    • type : 테이블에서 행을 찾아내는 방식
      • ALL : 처음부터 끝까지 스캔
      • INDEX : 인덱스 순서로 스캔
      • RANGE : 제한된 형태의 인덱스 스캔.
        • 인덱스 특정 범위에 있는 행들을 반환
        • =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN 과 같은 연산에 사용됨.
      • ref : 어떤 값 하나에 매치되는 행들을 반환.
        • 조건절의 비교 컬럼이 primary key 또는 unique key 인덱스가 아닐 경우
      • eq_ref : 테이블에서 찾은 값 중 단 하나의 값만 해당 테이블에 존재하는 경우
      • const : 쿼리의 일부를 상수로 대체시킬 수 있는 경우
        • const 테이블은 한번 밖에 읽혀지지 않기 때문에 매우 빠르다.
      • system : 무조건 하나의 열만 가지고 있는 테이블
    • possible_key : 쿼리를 위해 선택한 인덱스
      • NULL인 경우 연관된 인덱스가 없다는 의미이므로 이부분을 튜닝하여 성능을 개선할 수 있다.
    • key : 실제로 사용할 예정인 키(인덱스)
    • key_len : 인덱스 필드가 가질 수 있는 최대 길이
    • ref : key 컬럼에 나와있는 인덱스를 사용하기 위한 선행 테이블의 컬럼.
    • row : 원하는 행을 찾기 위해 얼마나 많은 행을 읽어야 할지 예측한 값
    • extra
      • using index : mysql 테이블에 접근하지 않도록 커버링 인덱스를 사용
        • 커버링 인덱스 : 쿼리를 실행 시키기 위해 필요한 데이터가 모두 포함된 인덱스
      • using where : 값을 가져온 뒤 행을 필터링
      • using temporary : 쿼리 결과를 정렬하기 위해 임시 테이블을 사용한다는 의미
      • using filesort : 결과의 순서를 맞추기 위해 인덱스 순서로 테이블을 읽는 것이 아니라 외부 정렬을 사용해야 한다는 것을 의미
      • range checked for each record(index map:N) : 적합한 인덱스가 없으므로 각 레코드 조인에서 각 인덱스들을 재평가한다는 것을 의미

Clone this wiki locally