mysql에서 쿼리 성능 테스트
개발 mysql 서버에서 쿼리 성능을 테스트할 스크립트를 설정하려고 합니다.자세한 내용은 다음과 같습니다.
- 루트 액세스 권한이 있습니다.
- 서버에 액세스하는 사용자는 나뿐입니다.
- InnoDB 성능에 가장 관심이 있음
- 입니다(
SELECT ... LIKE '%xy%'
)
제가 하고 싶은 일은 다른 변수에 의존하지 않고 단일 쿼리의 속도를 측정할 수 있는 신뢰성 있는 테스트 환경을 만드는 것입니다.
지금까지 SQL_NO_CACHE를 사용해 왔지만, 때때로 이러한 테스트 결과에서도 첫 번째 실행 시 실행 시간이 훨씬 더 오래 걸리고 이후 실행 시에도 시간이 더 적게 걸리는 캐싱 동작이 나타납니다.
만약 이 설명할 수 , 는 , 입니다를 할 것입니다.SQL_NO_CACHE
; 이 게시물에서 설명하는 바와 같이, 파일 시스템 캐시 및/또는 쿼리 실행에 사용되는 인덱스의 캐싱 때문일 수도 있다고 생각합니다.Buffer Pool과 Key Buffer가 언제 무효화되는지 또는 그것들이 어떻게 테스트를 방해할 수 있는지 저는 잘 모릅니다.
그렇다면 mysql 서버를 재시작하는 것 외에, 하나의 쿼리가 다른 쿼리보다 더 성능이 우수한지 판단할 때 신뢰할 수 있는 환경을 어떻게 설정하는 것이 좋겠습니까?
LIKE 연산 자체를 최적화할 수 없다고 가정하면, 검사해야 하는 행 수를 최소화하지 않고 기본 쿼리를 최적화해야 합니다.
이를 위해 유용할 수 있는 몇 가지 사항:
rows
EXPLAUSE SELECT... 결과의 열.그리고나서,
mysql> set profiling=1;
mysql> select sql_no_cache * from mytable;
...
mysql> show profile;
+--------------------+----------+
| Status | Duration |
+--------------------+----------+
| starting | 0.000063 |
| Opening tables | 0.000009 |
| System lock | 0.000002 |
| Table lock | 0.000005 |
| init | 0.000012 |
| optimizing | 0.000002 |
| statistics | 0.000007 |
| preparing | 0.000005 |
| executing | 0.000001 |
| Sending data | 0.001309 |
| end | 0.000003 |
| query end | 0.000001 |
| freeing items | 0.000016 |
| logging slow query | 0.000001 |
| cleaning up | 0.000001 |
+--------------------+----------+
15 rows in set (0.00 sec)
그리고나서,
mysql> FLUSH STATUS;
mysql> select sql_no_cache * from mytable;
...
mysql> SHOW SESSION STATUS LIKE 'Select%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Select_full_join | 0 |
| Select_full_range_join | 0 |
| Select_range | 0 |
| Select_range_check | 0 |
| Select_scan | 1 |
+------------------------+-------+
5 rows in set (0.00 sec)
또 는 ㅇlast_query_cost
을 . 즉, (입니다).
mysql> SHOW STATUS LIKE 'last_query_cost';
+-----------------+-------------+
| Variable_name | Value |
+-----------------+-------------+
| Last_query_cost | 2635.399000 |
+-----------------+-------------+
1 row in set (0.00 sec)
내 SQL 문서는 당신의 친구입니다.
이 페이지에서 인용:SQL_NO_CACH 옵션은 쿼리 캐시에 있는 쿼리 결과의 캐싱에 영향을 미칩니다.테이블이 상당히 작으면 테이블 자체가 이미 캐시되어 있을 수 있습니다.테이블이 아닌 결과의 캐싱을 피하기 때문에 때때로 설명된 동작을 얻을 수 있습니다.그래서 다른 게시물에서 말한 것처럼, 당신은 쿼리 사이에 테이블을 플러시해야 합니다.
알 수 , FLUSH TABLES
테스트 실행 사이에 최대한 재설정할 수 있습니다(쿼리 캐시를 notably합니다).
테스트는 InnoDB가 실제 성능을 수행하는 동안 상태가 다르다는 것을 고려하여 여러 시도에 걸쳐 총 성능에 관심을 갖게 되는 것이 아닙니까?모든 시도에서 InnoDB를 재설정하려면 성능 테스트를 얼마나 "실제"해야 합니까?다시 시작한 직후에 성능이 떨어지기 때문에 거부하는 쿼리는 InnoDB가 약간 워밍업한 후에 가장 좋은 쿼리일 수 있습니다.
제가 당신이라면 InnoDB의 성능과는 별개로 쿼리 옵티마이저가 무엇을 하고 있는지에 초점을 맞출 것입니다.InnoDB를 조정하는 방법에 대해서는 많이 쓰여져 있지만, 시작하기에 좋은 쿼리를 가질 수 있도록 도와줍니다.
또한 동등한 MyISAM 테이블을 사용하여 성능을 측정해 볼 수 있습니다.FLUSH TABLES
대부분 identical인 출발점으로 다시 설정해 줄 겁니다
쿼리 캐싱을 모두 끄려고 했습니까?SQL_NO_CACHE를 사용하더라도 쿼리 캐시를 사용하는 것만으로도 약 3%의 위약금이 발생합니다.
Matkit 사용을 고려해보셨습니까?제가 약간 익숙한 기능 중 하나는 tcpdump로 MySQL 네트워크 데이터를 캡처하고 dump를 처리하는 것입니다.mk-query-digest
. 이 도구를 사용하면 각 쿼리에 대한 세부 정보를 표시할 수 있습니다.하지만 질의 분석을 쉽게 할 수 있는 다른 도구들이 많이 있습니다.
mysql workbench를 사용해 볼 수 있습니다. sql statement 모니터가 있어서 얼마나 빠른지, 왜 빠른지 알 수 있습니다.
InnoDB의 전체 텍스트 쿼리는 느립니다("%query%" 문처럼). 이를 최적화하기 위해 사용자가 할 수 있는 일은 없습니다.사용자가 쿼리하는 특정 테이블을 MyISAM에 전달하는 것부터 다양한 솔루션이 제공되므로 전체 텍스트 인덱스를 생성할 수 있습니다(innoDB가 지원하지 않음). 행을 검색 가능한 인덱스로 정규화할 수 있습니다(권장되지 않음). http://www.doctrine-project.org/documentation/manual/1_1/nl/behaviors:core-behaviors:searchable 문제에 대한 "적절한" 솔루션은 Spinx Search 또는 Apache Solr와 같은 솔루션을 사용하여 전체 텍스트 검색을 사용하는 정보를 인덱스하는 것입니다.
앞서 말한 것처럼 결과를 비교할 때 캐시 상태를 고려해야 합니다. 프라이밍된 캐시는 매우 성능이 뛰어난 쿼리를 제공합니다.특정 쿼리의 캐시 적중률을 고려해야 합니다. 값비싼 쿼리라고 해도 캐시 적중률이 99%라면 평균 성능이 매우 높습니다.
쿼리를 미세하게 조정하는 것은 결코 쉬운 일이 아닙니다. 프로덕션 환경에서 전반적으로 무시할 수 있는 최적화를 위해 애플리케이션이 복잡해질 수 있습니다.
작업량을 고려하고, 자주 발생하는 수행되지 않는 쿼리를 해결합니다(mysql에서 slow_query_log를 사용하십시오. 무작정 쿼리 최적화를 시작하지 마십시오).
언급URL : https://stackoverflow.com/questions/2756100/testing-performance-of-queries-in-mysql
'it-source' 카테고리의 다른 글
PowerShell 시도/잡기/마침내 (0) | 2023.10.13 |
---|---|
PowerShell의 xargs와 동등한 수준은 얼마입니까? (0) | 2023.10.13 |
라인 아이템 우커머스 주문 받기 (0) | 2023.10.13 |
C에서 메모리를 동적으로 할당해야 하는 이유는 무엇입니까? (0) | 2023.10.13 |
C에서 문자열의 md5 해시를 생성하는 방법은? (0) | 2023.10.13 |