사용자 도구

사이트 도구


database:mysql:performance

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
database:mysql:performance [2012/09/16 14:00]
kwon37xi
database:mysql:performance [2020/08/26 16:05] (현재)
kwon37xi
줄 1: 줄 1:
 ====== MySQL 성능 ====== ====== MySQL 성능 ======
 +
 +===== 항상 확인 할 것 =====
 +  * 항상 운영체제의 **ulimit**값을 확인해야 한다. CentOS에서는 ''/etc/security/limits.conf''에서 **nproc** 값 조정.
 +
 +===== Primary Key index 정렬 순서 =====
 +  * MySQL의 기본 PK 정렬 순서는 **ASC**이다. 5.7 이하에서는 고정이며 8.0부터 ''DESC''지정이 가능해진다.
 +  * 따라서 PK 기준 정렬은 항상 ASC 으로 하는 것이 가장 최적의 성능을 낸다.
 +  * MySQL 8.0 이후부터는 명시적으로 ''CREATE TABLE''에서 정할 수 있으므로 그에 따른다.
 +  * [[https://www.percona.com/blog/2016/10/20/mysql-8-0-descending-indexes-can-speedup-your-queries/|MySQL 8.0 descending indexes can speedup your quereis]]
 +
 +===== Lock =====
 +  * [[http://blog.naver.com/seuis398/70117922756|MySQL(InnoDB)의 트랜잭션 모델]]
 +  * MySQL은 기본적으로 Read 에 Lock을 걸지 않는다. MVCC로 ISOLATION Level에 따라 값을 가져온다.
 +  * [[database:mysql:user_lock|MySQL User Lock]]
 +
 +===== Covering Index (커버링 인덱스) =====
 +  * select 대상 필드, order by, group by 등에 속하는 필드들을 모두 인덱스에서 값을 얻어올 수 있는 인덱스. 매우 속도가 빠르다.
 +  * PK 가 아닌 모든 인덱스는 그 끝단 데이터로 PK도 함께 가지고 있다. 따라서 PK는 인덱스에서 읽을 수 있다.
 +  * 실행 계획을 봤을 때 **Extra: Using index**가 있다면 커버링 인덱스로 모두 해결된 것.
 +  * 커버링 인덱스를 만들 때는 다음 순서로 한다.
 +    * WHERE 조건에 있는 컬럼 최우선
 +    * ORDER BY / GROPU BY 컬럼 그 다음
 +    * SELECT 에 있는 컬럼을 마지막
 +  * [[https://blog.toadworld.com/2017/04/06/speed-up-your-queries-using-the-covering-index-in-mysql|Speed up your queries using the covering index in MySQL]]
 +  * [[http://gywn.net/2012/04/mysql-covering-index/|MySQL에서 커버링 인덱스로 쿼리 성능을 높여보자!! | gywndi's database]]
 +  * 커버링 인덱스도 데이터이므로 마구 만들면 안 된다. 데이터량이 폭증하게 된다.
 +  * **SELECT/WHERE/ORDER BY/GROUP BY**에 커버링 인덱스에 속하는 컬럼과 PK 외에 다른 것이 들어오면 인덱스 사용을 중단할 수도 있다. -> 성능저하.
 +
 +===== 모니터링 툴 =====
 +  * [[http://slipp.net/questions/84|MySQL 관리툴들]]
 +  * [[https://github.com/box/Anemometer|Box Anemometer]] Slow Query Monitoring Tool
 +    * php.ini에 date.timezone = "Asia/Seoul" 이 설정되어 있는지 확인
 +  * [[http://www.percona.com/software/percona-toolkit|Percona | Percona Toolkit Software - MySQL Tools]] 각종 모니터링
 +  * [[http://java.dzone.com/articles/mysql-101-monitor-disk-io-pt|MySQL 101: Monitor Disk I/O with pt-diskstats ]]
 +===== slow query =====
 +<code>
 +slow_query_log = 1 # slow query 로그를 남겨라
 +slow_query_log_file = /var/log/mysql/mysql-slow-queries.log # 로그 파일
 +long_query_time = 0 # 지정된 초보다 오래 실행될 경우 남겨라. 초 단위. 최소값 0
 +</code>
 +
 +''slow_query_log_file''로 지정된 디렉토리와 파일은 mysqld 프로세스가 접근 가능하도록 권한 설정되어 있어야 한다.
 +
 +===== mysqlslap =====
 +  * 쿼리를 동시에 여러번 실행하는 방식으로 러프한 성능 테스트 수행.
 +  * http://dev.mysql.com/doc/refman/5.6/en/mysqlslap.html
 +
 +<code sh>
 +# 특정 데이터베이스에 대해서 명령 수행. --create-schema라는 이름과는 달리 스키마를 수정하거나 하지 않음.
 +mysqlslap --create-schema=[databasename] --user=myuser -p [options...]
 +
 +# 특정 파일에 있는 쿼리 실행. 구분자는 ;. 동시 50 쓰레드 200회 반복.
 +mysqlslap [접속정보들..] --delimiter=";" --query=쿼리모음파일 --concurrency=50 --iterations=200
 +</code>
 +
 +===== MySQL Tuner Perl =====
 +  * https://github.com/major/MySQLTuner-perl
 +  * [[http://mcchae.egloos.com/11063919#3611718|[MySQL] DB 튜닝]] - MySQL Tuner 소개
 +
 +===== 참조 문서 =====
   * [[http://gywn.net/2012/09/mysql-tuning/|MySQL 성능 최적화를 위한 몇 가지 팁!!]]   * [[http://gywn.net/2012/09/mysql-tuning/|MySQL 성능 최적화를 위한 몇 가지 팁!!]]
   * [[http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/|innotop]] : Innodb 락 찾기   * [[http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/|innotop]] : Innodb 락 찾기
줄 7: 줄 67:
   * [[http://gywn.net/2012/06/mysql-temporary-table-effect/|MySQL Temporary Table과 성능]]   * [[http://gywn.net/2012/06/mysql-temporary-table-effect/|MySQL Temporary Table과 성능]]
   * [[http://gywn.net/2012/07/mysql-replication-driver-error-report/|MySQL Replication Driver 오류 리포트]]   * [[http://gywn.net/2012/07/mysql-replication-driver-error-report/|MySQL Replication Driver 오류 리포트]]
 +  * [[http://gywn.net/2012/10/mysql-connection-limitation-nproc/|CentOS 6.x에서 ulimit 값을 확인해야 한다]] 
 +  * [[http://www.myexpospace.com/oracle2012/SessionFiles/CON8979_PDF_8979_0001.pdf|MySQL 5.6 Optimization]] 
 +  * [[http://gywn.net/2017/06/mysql-os-cache-management/|[MySQL] 바쁜 서비스 투입 전, 이런 캐시 전략 어때요? | gywndi's database]] 
 +  * [[https://d2.naver.com/helloworld/1155|성능 향상을 위한 SQL 작성법]] 
 +  * [[http://blog.daum.net/osban/17147432|MySQL InnoDB 성능 튜닝 기본 ]]
database/mysql/performance.1347771642.txt.gz · 마지막으로 수정됨: 2012/09/16 14:00 저자 kwon37xi