2024
MySQL Partition Table Performance
Partition 테이블 장단점 비교
파티션 테이블은 성능이점이 아니라 운영이점에 의해서 선택합니다.
그런데 성능이점은 과연 있을까 없을까?
이번 아티클은 성능 관점에서 파티션 테이블의 장단점을 비교해보았습니다.
2022
MySQL8.0 TempTable Flow
MySQL8.0 TempTable Flow
MySQL 8.0에서 Internal Temporary Table 방식이 변경되었다. Default TempTable이라는데 이게 기존과 어떤 차이가 있는지 확인해보자
MySQL+PMM docker-compose
2021
Back to Top ↑2020
MySQL 8.0 to MySQL 5.7 backward replication
MySQL 8.0 to MySQL 5.7 backward replication
Officially backward replication is not supported.
The server time zone value ‘KST’ is unrecognized or represents more than one time zone.
MySQL slave sql_thread command type in 8.0
MySQL slave sql thread command type in 8.0
8.0부터 slave sql thread의 command type 표시 내용이 다르다. 뭔가 남몰래 바뀐 느낌. 로깅을 위해서 버전별로 확인해두자.
PostgreSQL 2nodes HA using repmgr
PostgreSQL 2nodes HA using repmgr
procedure 호출을 통한 set 명령어실행
개요
Meta Data Lock 에 의한 Deadlock 발생 예제
개요
- 개발팀에서 Deadlock found when trying to get lock; try restarting transaction 메세지를 Application에서 받았다고 했지만, show engine innodb status 의 정보나 information_schema.INNODB_METRICS 테이블에 관련된 내용이 전혀 없었음.
MySQL slave delay under long history list
MySQL MVCC history list
MySQL은 default REPEATABLE READ라서, InnoDB 모든 변경을 undo에 마구마구 기록하게 됩니다. https://blog.jcole.us/2014/04/16/the-basics-of-the-innodb-undo-logging-and-history-system/ 그리고 오래된 트랜잭션때문에 history list가 커지면 성능저하가 발생하게 됩니다. https://www.percona.com/blog/2017/05/08/chasing-a-hung-transaction-in-mysql-innodb-history-length-strikes-back/
MySQL table definition cache LRU Maintenance
MySQL InnoDB table definition cache LRU Maintenance
InnoDB에서는 table definition cache를 server(frm) 와 engine level(InnoDB system table)에서 모두 관리합니다. sql을 실행할때마다, table definition 을 접근해야합니다. 이것을 frm file이나 system table에서 매번 가져와야한다면 엄청 느리겠지요. 그래서 MySQL은 이를 캐시하는 영역이 있습니다. table definition cache. 이를 어떻게 관리하는지 설명합니다.
Connect/J Version에 따른 Character set JDBC옵션
2019
MySQL에서 null safe equal operator (<=>)
MySQL convert to character set utf8mb4 using pt-osc
MySQL convert to character set
mysql 전체 테이블의 character set을 일괄로 변경하고자 할때 온라인으로 변경하는 방법을 설명한다.
Vagrant를 이용한 MySQL Source 설치하기
MySQL 디버깅을 위한 Docker 안에서 MySQL Source 설치하기
주의사항
- 해당 스크립트는 MySQL Debugging 을 위해 debug버젼을 compile하는데 목적이 있음으로 OS root유저로 진행한다. 사용을 위해서는 정상적인 절차 (mysql user 생성 / systemd 등록..) 를 진행한다.
- 5.7 과 8.0은 명령어가 조금 다른데, 해당이유는 8.0을 compile 하기 위해서는 cmake 버젼과 gcc 버젼을 올려줘야 한다.
- cmake >= 3.0
- GCC >= 4.8 (C++ 11) (MySQL 5.7의 경우, GCC >= 4.4)
- 8.0 compile시,
fatal error: ld terminated with signal 9 [Killed]
라는 에러가 발생했는데 이는 docker가 사용했던 메모리가 부족 (2GiB)하여 발생되었다. oom 세팅과 메모리를 4GiB로 올린 후 문제는 발생하지 않았다. - windows 는 깔끔하게 mysql_debug binary를 받아서 사용하면 된다. :-)
Docker를 이용한 MySQL RPM 설치 및 기타 Tool 설치
명령어 모음
OS 명령어
Docker로 centos 이미지 만들기
docker search centos
docker pull centos
docker images -a
docker run -dit --hostname C7_M8017 --name centos7_mysql8017 centos
docker container ls -a
docker exec -it centos7_mysql8017 /bin/bash
Xcode를 통한 MySQL Build 및 Debug
Windows를 사용할때 Visual Studio 사용하며 디버깅할때의 편안함을 잊지 못하고 Xcode를 통해 build 하는 방법에 대해 로깅
Alter table시 소요시간 예측해보기
개요
* Alter table 명령어를 실행하고 나면, 현재 진행상황이 어느정도인지 궁금할때가 있다.
일반적으로 파일사이즈나 show engine innodb status를 통해 가늠해볼 수는 있지만, 정확한 값은 아니며 때로는 여러단계에서 같은 작업을 진행함으로 현재 작업을 얼마나 더 해야 하는지 예상하기 쉽지 않다.
MySQL 5.7부터는 Performance_schema 를 이용하여, Alter 명령어에 대해 모니터링을 할 수 있다.
MySQL decimal type 제대로 알고 사용하기
decimal type 제대로 알고 사용하기
mysql에서 실수를 표현할때는 보통 decimal 혹은 double을 사용하게 된다. 이 둘의 차이점이 무엇이고, decimal 을 사용하는 경우에 주의할 점을 기술한다.
MySQL explicit_defaults_for_timestamp
explicit_defaults_for_timestamp 에 대해서
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).
MySQL Bug when using server-side prepared statements
MySQL Bug when using server-side prepared statements
MySQL 8.0 - InnoDB Architecture 변경사항
MySQL 8.0 - Err 파일의 형식 변경
MySQL 8.0 - TABLE 생성시, 변경사항
MySQL 8.0 - Authentication_plugin 의 변경
MySQL 8.0 - 기본 CharacterSet 의 변경
MySQL 8.0 - 추가된 GIS functions
MySQL 8.0 - 추가된 String functions
MySQL 8.0 - X Dev API의 활용
MySQL 8.0 - Performance_schema events_statements_histogram_by_digest Table
MySQL 8.0 - Performance_schema events_errors_summary_by_user_by_error Table
MySQL 8.0 - Performance_schema data_locks Table
MySQL 8.0 - Replication By Channel
MySQL 8.0 - Function Based Index (Functional Key Parts)
MySQL 8.0 - Descending Index
MySQL 8.0 - Invisible Index
MySQL 8.0 - 추가된 OPTIMIZER HINT
MySQL 8.0 - SKIP LOCKED, NOWAIT
MySQL 8.0 - Window function
MySQL 8.0 - Common Table Expression
MySQL 8.0 - Role 기능 추가
MySQL 8.0 - SET PERIST 구문
MySQL 8.0 - ALTER TABLE ALGORITHM=INSTANT 옵션
Disable index_merge on MySQL
Disable index_merge on MySQL
2018
Crash recovery and Data integrity on MySQL
Crash recovery on MySQL
MySQL Add an AUTO_INCREMENT column to a partitioned table
Add an AUTO_INCREMENT column to a partitioned table
사용중인 파티션테이블에 AI column을 추가하려고한다. 이때 AUTO_INCREMENT속성으로 add column, ALGORITHM=INPLACE 하면 에러가 발생한다. 현상을 살펴보자.
MySQL Fractional timestamp and Partition pruning
MySQL Fractional timestamp and Partition pruning
MySQL Read Committed vs. Repeatable Read
Read Committed vs. Repeatable Read
- MySQL의 Isolation level은 전통적으로 Repeatable Read 를 default로 한다.
- 하지만 반드시 repeatable read가 필요한 경우에만 lock을 사용하고 그외에서는 committed 를 봐도 무방하다면, 다른 RDBMS와 같이 Read committed를 default Isolation level로 하는 건 어떨까.
- 막연하게 Read Committed가 lock contention이 더 줄고, 동시성에 더 좋을 것 같다.
- 그리고 Repeatable read 에서 long running query (혹은 슬프게도 transaction이 제대로 close되지 않아서)가 돌때 undo가 너무 많이 쌓여서 전체적으로 성능에 영향을 주는 상황도 회피할 수 있다.
MTS considerations
MTS considerations
Multi-threaded slave(MTS)를 통해서 slave delay를 줄일수 있을까.
- → YES. https://mysqlhighavailability.com/multi-threaded-replication-performance-in-mysql-5-7/
- 실제로 slave delay가 발생하는 시스템에서 MTS on/off test결과 효과적인 것을 확인 할 수 있었다.