실행파일 exe, jar..etc 프로그램이 실행되면 그게 메모리 위로 올라가서 실행된다. 우린 이거 프로세스라 부른다
프로세스 = 메모리(Stack,Heap등) + 코드 , 여기서 메모리는 코드에 영향을 받는다
-> TPS가 높고 Mean test time이 낮을수록 좋은결과
Artillery는 yml 파일로 테스트 컨트룰을 한다.
artillery run --output report.json scenario-test-config.yaml 이런식으로 어떤 yml을 사용할지 설정 가능함
- p95 = 95%의 유저가 이정도로 느낀다, -> p95 와 p99의 차이가 많이 나지 않아야 좋음
- http.codes.200: 상태 코드가 200(OK)인 HTTP 응답 수
- http.request_rate: 초당 HTTP 요청 수
- http.requests: 총 HTTP 요청 수
- http.response_time: 최소, 최대, 중앙값, 95번째 백분위수 및 99번째 백분위수 응답 시간을 포함한 HTTP 요청의 응답 시간에 대한 통계
- http.responses: 수신된 총 HTTP 응답 수
- vusers.completed: 테스트를 완료한 총 가상 사용자 수
- vusers.created: 테스트 중에 생성된 총 가상 사용자 수
- vusers.created_by_name: test.yaml 파일에 정의된 각 시나리오에 대해 생성된 가상 사용자 수
- vusers.failed: 테스트 중 실패한 총 가상 사용자 수
- vusers.session_length: 최소, 최대, 중앙값, 95번째 백분위수 및 99번째 백분위수 세션 길이를 포함하여 가상 사용자의 세션 길이에 대한 통계
- TPS: 평균 TPS
- Peak TPS: 최고 TPS
- Mean Test Time: 평균 테스트시간
- Executed Tests: 테스트 실행 횟수
- Successful Tests: 테스트 성공 횟수
- Errors: 에러 횟수
- Run time: 테스트 실행시간
local cahce
- 로컬 캐시는 애플리케이션 내부에서만 유효하며, 동일한 애플리케이션 내의 여러 모듈이나 서비스 간에는 공유되지 않습니다.
- 또한, 메모리 내에 데이터를 저장하므로 매우 빠른 읽기 및 쓰기 성능을 제공합니다.
- 로컬 캐시는 애플리케이션의 JVM 내부 또는 로컬 서버에 저장되며, 외부에서 접근할 수 없습니다.
GloballCache
- 글로벌 캐시는 여러 서버 또는 애플리케이션 간에 데이터를 공유할 수 있습니다.
- 글로벌 캐시는 주로 네트워크를 통해 데이터에 접근하므로 로컬 캐시에 비해 상대적으로 느린 읽기 및 쓰기 성능을 가질 수 있습니다.
- 글로벌 캐시는 주로 네트워크를 통해 외부 서버에 데이터를 저장하므로 여러 애플리케이션이 공유할 수 있습니다.
-> 캐시가 빠르다고 다 캐시로 사용하면 안됀다. 오히려 히트율이 떨어지는 데이터 조회시 캐시에서 한번찾고 DB에서 한번 더찾는 '이중작업'이 나올 가능성이 크기 때문
SELECT * FROM notice
WHERE createDate BETWEEN {startDate} AND {endDate}
;
-- 인덱스 생성
CREATE INDEX idx_notice_createDate ON notice ( createDate );
-- 인덱스 확인
show index from notice;
SELECT
CONCAT(ROUND(COUNT(DISTINCT id) / COUNT(*) * 100, 2), '%') AS id_cardinality,
CONCAT(ROUND(COUNT(DISTINCT title) / COUNT(*) * 100, 2), '%') AS title_cardinality,
CONCAT(ROUND(COUNT(DISTINCT content) / COUNT(*) * 100, 2), '%') AS content_cardinality,
CONCAT(ROUND(COUNT(DISTINCT who) / COUNT(*) * 100, 2), '%') AS who_cardinality,
CONCAT(ROUND(COUNT(DISTINCT createDate) / COUNT(*) * 100, 2), '%') AS createDate_cardinality,
CONCAT(ROUND(COUNT(DISTINCT updateDate) / COUNT(*) * 100, 2), '%') AS updateDate_cardinality
FROM notice;
explain
SELECT * FROM notice
WHERE createDate BETWEEN '2023-01-15 00:00:00' AND '2023-01-15 23:59:59'
;
CREATE INDEX idx_notice_who ON notice ( who );
show index from notice;
explain
SELECT * FROM notice
WHERE who = 'incu19'
and
createDate BETWEEN '2023-01-15 00:00:00' AND '2023-01-15 23:59:59'
;
// 힌트 기능을 사용해서 강제로 idx_notice_who 인덱스를 타도록 하기.
explain
SELECT * FROM notice use index(idx_notice_who)
WHERE who = 'incu19'
and
createDate BETWEEN '2023-01-15 00:00:00' AND '2023-01-15 23:59:59'
;
4.Null값을 비교하는 경우
show variables like '%profiling%';
// profiling 기능 활성화하기
set profiling=1;
set profiling_history_size=100;
SELECT * FROM study_db.notice
WHERE createDate BETWEEN '2023-01-15 00:00:00' AND '2023-02-14 23:59:59'
;
show profiles ;
// 해당 쿼리문의 수행 시간을 더 상세한 단위로 확인
show profile for query 23;
// 해당 쿼리의 CPU 사용량을 분석
show profile cpu for query 23;