db 접속 안됨 - 참고 : https://dev-youngjun.tistory.com/260
docker exec -it mysql bash
mysql -u root -p
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
해도 안됨
mysql> SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
+------+-----------+-----------------------+
| user | host | plugin |
+------+-----------+-----------------------+
| root | % | mysql_native_password |
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+
2 rows in set (0.01 sec)
로 떠서 localhost도 mysql_native_password로 변경
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
그래도 안됨
localhost 대신 127.0.0.1로 수정해도 안됨
CREATE USER IF NOT EXISTS 'root'@'172.19.0.1' IDENTIFIED WITH mysql_native_password BY 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.19.0.1' WITH GRANT OPTION;
+------+------------+-----------------------+
| user | host | plugin |
+------+------------+-----------------------+
| root | % | mysql_native_password |
| root | 172.19.0.1 | mysql_native_password |
| root | localhost | mysql_native_password |
+------+------------+-----------------------+
3 rows in set (0.00 sec)
전용 계정 만듦
그래도 안되서 도커 컨테이너 다 지우고 다시 진행
docker system prune -a => docker compose up -d --build
이것저것 다 했는데 그런 문제가 아니라 main에 있는 yml 파일에는 로컬 pw로 되어 있었음
※ 참고 : 아이디 비번 전부 root로 설정함
인덱스 생성
-- BillingHistory 테이블
CREATE INDEX idx_bh_month_id ON billing_history(billing_month, billing_id);
-- Line 테이블 (조인 성능 향상)
CREATE INDEX idx_line_due_id ON line(due_date_id, line_id);
멀티 쓰레드 사용
기존 속도 - 1000개에 8.3초
112300개에 11분47초(707초) => 1000개에 6.3초로 약간 더 빨라짐
쿼리문 수정
WHERE b.billing_month = :billingMonth
AND b.line_id IN (SELECT l.line_id FROM Line l INNER JOIN dueDate d ON l.due_date_id = d.due_date_id WHERE d.date = :targetDay)
4000건 32.78초 => 1000건 8.19초
쿼리의 중요성을 깨달음. 생각보다 시간이 너무 오래 걸림
배치에서 시간을 잡아먹는게 아니라 Reader에서 시간이 걸리기 때문
FROM BillingHistory b
INNER JOIN Line l ON b.line_id = l.line_id
INNER JOIN dueDate d ON l.due_date_id = d.due_date_id
WHERE b.billing_month = :billingMonth AND d.date = :targetDay
SELECT b.billing_id, b.line_id, b.amount, b.billing_month
FROM line l
INNER JOIN due_date d ON l.due_date_id = d.due_date_id
INNER JOIN billing_history b ON l.line_id = b.line_id
WHERE d.date = :targetDay AND b.billing_month = :billingMonth
납기일이 15일인 line을 먼저 필터링(Index Scan)하고, 그 결과에 해당하는 billing_history만 조인해서 가져오기