데이터베이스/MySQL
-
[MySQL] 쿼리성능 개선하며 알게된 것 기록 📝데이터베이스/MySQL 2022. 8. 20. 20:38
사내 운영툴 메인 페이지의 로딩 속도가 너무 느린 이슈가 있었고 호출되는 API의 응답속도가 거의 2초 이상 소요되는 것을 발견했다. 현재 서비스를 사용하고 있는 브랜드와 매장 및 각 매장의 상태 값과 포스 신호 수신 여부 등에 대한 데이터를 한 번에 가져오는 API이기는 하나, 몇십만 건의 데이터도 아닌데 이 정도로 속도가 느린 건 문제 있다고 판단했다. 해당 API에서 사용하는 프로시저는 2개였고 각각 약 1.2초, 0.6초 이상 걸리는 슬로우 쿼리였다. (보통 1초 이상 걸리는 경우를 슬로우 쿼리라고 판단하나, 데이터 양이 많지 않은데 0.6초나 걸리면 이 역시 슬로우 쿼리다.) 가져오는 데이터 양을 줄이는 방법도 속도 개선을 하는 방법 중 하나이지만, 그전에 근본적인 원인부터 고치는 게 맞다고 생..
-
[MySQL] Timestamp 타입과 Datetime 타입의 차이 🕰데이터베이스/MySQL 2022. 8. 14. 21:03
이 포스팅을 하게 된 이유는 업무 중 우연히 어떤 에러를 발견했기 때문이었다. 당시 데이터 만료 기간을 설정하는 중이었고 특정 조건에서는 만료 기간을 과거 날짜로 세팅하여 데이터 제공을 중단하기로 했다. 그런데 이 과정에서 Timestamp 타입에 알맞지 않은 값이라는 에러가 발생했고 이에 대해 MySQL 날짜 타입인 Timestamp와 Datetime의 차이가 궁금해졌다. INSERT INTO mydb.tb_test(date_datetime, date_timestamp) VALUES('1970-01-01', '1970-01-01'); 차이점 1 Timestamp 타입은 1970-01-01 00:00:01 ~ 2038-01-19 08:44:07까지의 데이터만 지원하고, Datetime 타입은 1000-0..
-
[MySQL] 숫자가 포함된 문자열 정렬데이터베이스/MySQL 2022. 7. 6. 21:27
📝 오늘 업무 하면서 알게 된 것 기록! 업무중에 다수의 지점을 이름 기준으로 정렬해야 했는데 지점명에 한글, 영문뿐만 아니라 숫자도 포함이 된 상황이었다. 처음에는 단순히 아래처럼 쿼리를 작성했다. (회사에서 실제로 사용했던 쿼리를 여기다가 그대로 적을 수는 없으니 ORDER BY 부분만 참고) SELECT tb_a.area_name FROM group.tb_area AS tb_a ORDER BY tb_a.area_name; 숫자와 문자알아서 구분되어 정렬될 거라고 생각했으나 사진과 같이 숫자 부분이 예상과 다르게 정렬되었다. 결론부터 이야기하자면 MySQL에서 텍스트 타입의 숫자는 문자로 인식된다.(당연한 얘기긴 하지만...) 그렇기 때문에 숫자는 숫자대로 문자는 문자대로 기준에 맞게 정렬하기 위해..
-
[MySQL] Table Lock (feat. Deadlock 💀)데이터베이스/MySQL 2022. 4. 18. 02:10
틀린 내용을 발견하시면 말씀 부탁드립니다! 🙇 특정 테이블이 업데이트될 때 동작하는 트리거에서 수정할 부분이 있어 수정 후 저장을 하려고 했는데 계속 Table Lock 걸리는 이슈가 생겼다. 이슈는 (팀장님이) 해결했는데,-뭔지는 모르겠지만 트랜잭션 1개가 계속 동작하고 있었고 해당 트랜잭션을 kill하니 트리거 수정 내용이 정상 반영됨- 정확히 어떤 상황에서 Lock이 발생하고 이를 해결하기 위해 뭘 확인해야 하는지 궁금한 관계로 이번 기회에 정리하기로 했다. SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; # 문제있는 트랜잭션을 찾아 TRX_ID를 kill cf) INFORMATION_SCHEMA.INNODB_TRX: 트랜잭션이 락 때문에 대기 상태인지 뿐만 아니라 ..
-
[MySQL] 테이블의 auto increment number 가져오기데이터베이스/MySQL 2022. 3. 28. 07:25
고유키가 필요할 때 테이블의 auto increment를 활용하는 경우가 있다. 이럴 때 사용할 수 있는 쿼리. SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = [db name] AND TABLE_NAME = [table name]; 이외에 참고할 수 있는 쿼리를 정리한 링크 (상황에 따라 알맞은 것을 사용하면 될 것 같다) https://thispointer.com/4-ways-to-get-last-inserted-id-of-a-mysql-table/#four 4 ways to get last inserted id of a MySQL table – thisPointer To provide the best experi..
-
[MySQL] GROUP_CONCAT length 제한데이터베이스/MySQL 2022. 3. 4. 02:27
작업 중에 group_concat을 활용하여 객체를 요소로 갖는 배열 형태를 반환하게끔 했는데 길이 제한 때문에 텍스트가 잘리는 이슈가 발생했다. 구글링 해보니 group_concat은 1024 문자가 기본값이라고 한다. 이 정도 길이는 택도 없었기 때문에 group_concat의 최대 길이를 변경했다. SET SESSION group_concat_max_len = 150000; 글로벌하게 적용하고 싶다면 GLOBAL 키워드를 사용하면 된다. SET GLOBAL group_concat_max_len = 150000; 아래 쿼리를 실행하면 group_concat의 기본 길이 확인할 수 있다. SHOW VARIABLES LIKE '%GROUP_CONCAT%' 참고자료 https://sebhastian.com..
-
[MySQL] SQL Error Explicit or implicit commit is not allowed in stored function or trigger데이터베이스/MySQL 2022. 1. 31. 18:56
MySQL 함수를 작성하다 마주친 에러와 구글링을 하며 알게 된 사실에 대해 짧게 기록해본다. 에러 발생 원인부터 말해보자면 함수 내에서 프로시저를 호출했기 때문이었고, 함수 대신 프로시저를 사용하여 에러를 해결했다. 에러 문구에 나와있듯 Stored function 또는 트리거 내에서는 commit이 허용되지 않는다. 즉 Stored function 내부에서는 트랜잭션 작업을 수행하면 안 된다. → Stored procedure와 차이점 https://stackoverflow.com/questions/16969875/error-code-1422-explicit-or-implicit-commit-is-not-allowed-in-stored-function Error Code: 1422. Explicit ..
-
[MySQL] MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction데이터베이스/MySQL 2022. 1. 23. 18:22
개발 서버 DB에서 특정 데이터를 삭제하려고 했는데 timeout이 발생하는 이슈가 생겼다. 처음에는 단순히 내가 사용하고 있는 DB툴 문제 인가 생각했는데 아니었고, lock 걸린건가 확인해봤는데 이것 역시 아니었다. # 모든 프로세스 조회 SHOW FULL PROCESSLIST; # 락테이블 조회 select * from information_schema.innodb_locks; # 대기중인 락 조회 select * from information_schema.innodb_lock_waits; # 트랜젝션조회 select * FROM information_schema.INNODB_TRX; INNODB_TRX 테이블에서 현재 실행되고 있는 트랜잭션들을 찾았고, PROCESSLIST 테이블에서 각 trx_..