7.1 DB 측 캐싱
MySQL은 테이블 작업 시 확장성이 뛰어난 알고리즘을 사용하므로 적은 양의 메모리로도 MySQL을 실행할 수 있습니다. 당연히 더 나은 성능을 위해서는 더 많은 RAM이 필요합니다.
현재 설정을 보려면 데이터베이스에 연결하십시오.
#mysq -u root -p
mysql> show variables like 'query_cache%';
+------------------------------+-----------+
| Variable_name | Value |
+------------------------------+-----------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 134217728 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+-----------+
5 rows in set (0.00 sec)
먼저 캐싱이 활성화되어 있는지 확인하십시오. 변하기 쉬운:
query_cache_type
ON(1) 또는 DEMAND(2)여야 합니다.query_cache_limit
- 캐시에 들어갈 결과의 최대 크기를 결정합니다.query_cache_size
제로와 달라야 합니다. DEMAND를 사용하는 경우 지시어가 포함된 요청만 캐시됩니다.SQL_CACHE;
query_cache_min_res_unit
캐시된 쿼리의 결과를 저장하기 위해 할당된 메모리 블록의 최소 크기입니다.query_cache_min_res_unit
MySQL은 캐시를 하나의 큰 메모리 청크에 저장하지 않고 대신 요청 시 최소 크기(기본적으로 =4KB)로 블록을 할당합니다 . 이러한 마지막 블록은 데이터 크기로 잘리고 나머지 메모리는 해제됩니다.
캐싱의 효과는 서버가 요청을 수신할 때 요청의 해시가 캐시에 있는지 확인하는 것입니다. 해시가 일치하면 서버는 요청 구문 분석, 최적화 등을 수행하지 않고 즉시 결과를 반환합니다. 오버헤드 - 캐싱 메커니즘과 함께 - 캐시 탐색, 쿼리 결과를 캐시에 쓰기 등
그리고 캐시에 작은 요청이 많으면 많은 수의 사용 가능한 블록으로 인해 메모리 조각화가 발생할 수 있습니다. 그리고 이로 인해 메모리 부족으로 인해 캐시된 항목이 삭제됩니다. 이 경우 의 값을 줄이는 것이 합리적입니다 query_cache_min_res_unit
. 대부분의 쿼리가 큰 결과를 생성하는 경우 이 설정을 늘리면 성능이 향상될 수 있습니다.
효과를 평가해 봅시다. 캐시 적중 카운터가 어떻게 변경되는지(Qcahe_hits), 메모리 부족으로 인해 유효하지 않은 것으로 선언된 요청 수(Qcache_lowmem_prunes), SELECT 유형의 총 요청 수(캐시된 요청만)를 살펴봅니다.
#mysq -u root -p
mysql> show status like 'Qcache%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 715 |
| Qcache_free_memory | 130369640 |
| Qcache_hits | 24209 |
| Qcache_inserts | 16215 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 444 |
| Qcache_queries_in_cache | 1740 |
| Qcache_total_blocks | 4225 |
+-------------------------+-----------+
8 rows in set (0.00 sec)
7.2 현재 캐시 상태
쿼리 캐시를 모니터링하려면 다음이 사용됩니다 SHOW STATUS
.
mysql> SHOW STATUS LIKE 'Qcache_%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 10 |
| Qcache_free_memory | 16755496 |
| Qcache_hits | 49812 |
| Qcache_inserts | 103999 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 180 |
| Qcache_queries_in_cache | 6 |
| Qcache_total_blocks | 28 |
+-------------------------+----------+
8 rows in set (0.00 sec)
Qcache_free_blocks
캐시에 얼마나 많은 여유 블록이 있는지 보여줍니다(캐시된 요청이 증가함에 따라 감소함).Qcache_total_blocks
- 점유된 블록의 수Qcache_free_memory
- 캐싱을 위한 여유 "사용 가능한" 메모리를 표시합니다.Qcache_hits
- 실제로 데이터베이스에 액세스하지 않고 캐시에서 가져온 결과인 요청 수Qcache_inserts
- 캐시에 추가된 요청 수Qcache_lowmem_prunes
- 메모리 부족으로 인해 캐시에서 제거된 요청 수Qcache_not_cached
- 시간 관리 기능 등의 사용으로 인해 캐시에 기록되지 않은 요청 수Qcache_queries_in_cache
- 캐시에 있는 요청 수.
총 SELECT 쿼리 수를 볼 수 있습니다.
mysql> show status like 'Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select | 16719 |
+---------------+-------+
1 row in set (0.00 sec)
7.3 캐싱 효율성
Qcache_hits on Qcache_hits + Com_select
“ 요청을 처리할 때 Qcache_hits 카운터(요청이 캐시에서 처리된 경우) 또는 Com_select(요청이 캐시되지 않은 경우)가 증가하기 때문에 변수 값을 나누어 캐시의 효율성을 평가하는 것이 좋습니다 . 이 방법은 "Mysql 성능 최적화" 오라일리에서 제안합니다.
온라인에는 또 다른 방법이 있습니다
qcache_hit_ratio = qcache_hits / (qcache_hits + qcache_inserts + qcache_not_cached)
이 값이 > 0.8이면 요청의 80%가 캐시되며 이는 매우 좋은 지표입니다.
캐시 적중률이 낮 으면 %
값을 높여야 합니다 query_cache_size
.
현재 값은 다음과 같이 볼 수 있습니다.
SHOW VARIABLES LIKE 'query_cache_size';
다시 질문이 생깁니다. 적절한 값을 선택하는 방법query_cache_size?
이것은 도움이 될 것입니다 Qcache_lowmem_prunes
. 이 변수는 새 요청을 캐시해야 하기 때문에 캐시에서 제거된 요청 수를 저장합니다. Qcache_lowmem_prunes
약간만 증가하는 캐시 크기를 위해 노력할 필요가 있습니다 . 이를 위해 시간당 값의 차이 Qcache_lowmem_prunes
와 같은 시간에 mysql이 받은 요청 수를 비교하는 것이 좋습니다.
“실제로 query_cache_size를 계산하는 데 두 가지 공식 중 하나를 사용할 수 있습니다.
query_cache_size = (number of requests for 10 minutes)*(average response volume on request) * 1,2
또는
query_cache_size = (number of requests for 10 minutes)*(average response volume on request) * 1,2
query_cache_size = (10분 동안의 트래픽 양) * 1.2"
이렇게 하면 10분 동안 요청을 캐시하고 캐시 조각화 및 추가 캐싱 예약을 위한 추가 20% 메모리를 제공합니다.
Bytes_sent 변수를 사용하여 요청에 대한 응답의 수와 평균 볼륨을 각각 계산할 수 있습니다.
그래서 우리 는 가치를 높였습니다. 그 후에는 가치 query_cache_size
에주의를 기울여야합니다 . MySQL은 캐시를 블록에 저장합니다. 1개의 요청에 대해 2개의 블록이 필요합니다. 하나는 요청 텍스트 자체용이고 다른 하나는 결과용입니다.Qcache_total_blocks
Qcache_free_blocks
Qcache_queries_in_cache
값에서 테이블을 고려하면Qcache%
총 캐시 블록 수Qcache_total_blocks – 28
이제 요청 6이 캐시됩니다. 즉, 6 * 2 = 12 블록이 사용 중임을 의미합니다.
무료 블록 Qcache_free_blocks – 10
. 유휴 가 많을수록 Qcache_free_blocks
캐시의 "조각화" 정도가 커집니다.
대부분의 쿼리에 소량의 결과 데이터가 있는 경우 query_cache_min_res_unit
기본적으로 4KB인 최소 캐시 블록 크기를 줄이는 것이 좋습니다.
대부분의 요청이 많은 데이터를 반환하는 경우 캐시 블록의 크기를 늘릴 가치가 있습니다.
가장 중요한 것은 최소값을 달성하는 것입니다 Qcache_free_blocks
.
카운터 Qcache_not_cached
가 크면 변수를 늘릴 수 있습니다. query_cache_limit
이렇게 하면 제한을 늘리고 "적합하지 않은" 쿼리 결과를 캐시할 수 있습니다.
다음 구성 변수는 쿼리 캐시 사용을 담당합니다.
query_cache_size
— 쿼리 캐시의 크기.query_cache_size = 0
캐시 사용을 비활성화합니다.query_cache_limit
- 캐시에 저장된 최대 샘플의 크기query_cache_wlock_invalidate
- 데이터가 속한 테이블이 읽기용으로 잠긴 경우 데이터를 캐시에서 가져올지 여부를 결정합니다. =
mysql 쿼리 캐싱을 활성화하려면 my.cnf ([mysqld] 섹션) 에 다음 줄을 추가하기만 하면 됩니다 .
query_cache_size = 268435456
query_cache_type =1
query_cache_limit =1 048576
그리고 서비스를 다시 시작하십시오.
7.4 캐시가 사용되지 않는 경우
캐시되지 않음:
- 요청
SQL_NO_CACHE
- 준비된 쿼리
(Prepared statements);
- 외부 쿼리의 하위 쿼리인 쿼리입니다.
- 저장 프로시저 및 함수 내부의 쿼리
- 함수를 사용하는 쿼리:
BENCHMARK ()
,CONNECTION_ID ()
,CONVERT_TZ ()
,CURDATE ()
,CURRENT_DATE ()
,CURRENT_TIME ()
,CURRENT_TIMESTAMP ()
,CURTIME ()
, 인수 없이 , , , , , , ,DATABASE ()
, , , _ _ENCRYPT ()
FOUND_ROWS ()
GET_LOCK ()
LAST_INSERT_ID ()
LOAD_FILE ()
MASTER_POS_WAIT ()
NOW ()
RAND ()
RELEASE_LOCK ()
SLEEP ()
SYSDATE ()
UNIX_TIMESTAMP ()
USER ()
UUID ();
- 저장된 함수, 사용자 변수 또는 mysql 시스템 데이터베이스 또는 INFORMATION_SCHEMA의 참조 테이블을 사용하여 쿼리합니다.
- • 다음 형식의 요청:
SELECT ... IN SHARE MODE
SELECT ... FOR UPDATE
SELECT ... INTO OUTFILE ...
SELECT ... INTO DUMPFILE ...
SELECT * FROM ... WHERE autoincrement_col IS NULL
- 임시 테이블이 있는 쿼리 또는 테이블을 전혀 사용하지 않는 쿼리
- 경고 생성 요청(경고)
다음 명령을 사용하여 캐시 조각 모음을 수행할 수 있습니다.
mysql>flush query cache;
지우기 - 명령:
mysql>flush query cache;
가장 중요한
기본 설정으로 프로덕션 환경에서 작업하지 마십시오.. 이로 인해 대부분의 서버 리소스가 사용되지 않습니다. 적절한 MySQL 튜닝은 데이터베이스 성능을 몇 배로 향상시킬 수 있습니다. 이렇게 하면 애플리케이션 속도가 빨라질 뿐만 아니라 무거운 부하에도 대처할 수 있습니다.
GO TO FULL VERSION