[MySQL] 가상 칼럼(파생 칼럼) Virtual Column
·
MySQL
가상 칼럼(Virtual Column) 혹은 Generated Column?다른 DBMS에서는 가상 칼럼(Virtual Column)이라는 이름으로 사용되지만, MySQL 서버에서는 Generated Column이라는 이름으로 소개되고 있다.가상 칼럼은 특정 데이터 타입에 국한되지 않는다. 그렇지만 칼럼을 정의하는 한 가지 방법이기도 하다. 가상 칼럼은 테이블에 실제로 데이터가 저장되지 않고, 다른 칼럼의 값을 기반으로 동적으로 계산된 값을 제공하는 칼럼이다. MySQL 서버의 가상 칼럼은 크게 가상 칼럼(Virtual Column)과 스토어드 칼럼(Stored Column)으로 구분할 수 있다. -- // 가상 칼럼(Virtual Column) 사용 예제CREATE TABLE tb_virtual_col..
[MySQL] Deterministic / Not Deterministic 스토어드 프로그램 옵션
·
MySQL
Deterministic 과 Not Deterministic 옵션의 정의이 두 옵션은 스토어드 프로그램 옵션 중 성능과 관련된 옵션이다.이 두 옵션은 서로 배타적이기 때문에 둘 중 하나의 옵션은 반드시 선택해야한다. DETERMINISTIC : 스토어드 프로그램의 입력이 같다면 시점이나 상황에 관계없이 결과가 항상 같다. (확정적, 상수화)NOT DETERMINISTIC : 입력이 같아도 시점에 따라 결과가 달라질 수 있다. 여기서 DETERMINISTIC의 속성을 보면 일반적인 프로그래밍에서 데이터의 불변성(Immutability)을 보장하는 것처럼 보인다.하지만 이 둘은 개념은 비슷하지만 완전히 동일하지는 않다. 일반적인 프로그래밍에서의 불변성은 데이터 자체가 변경되지 않음을 보장하며, 이를 통해 상..
[MySQL] 해시 파티션 (Hash Partition)
·
MySQL
MySQL에서의 해시 파티션 (Hash Partition)해시 파티션은 MySQL에서 정의한 해시 함수에 의해 레코드가 저장될 파티션을 결정하는 방법이다.MySQL이 정의한 해시 함수는 복잡한 알고리즘이 아닌, 파티션 표현식의 결과값을 파티션의 개수로 나눈 나머지로 저장될 파티션을 결정하는 방식이다.결과값 % 파티션의 개수 = 파티션 위치예를 들어, 결과값이 7이고 파티션 개수가 4라면:7 % 4 = 3따라서, 3번 파티션에 저장하게 된다.이 방식을 통해 알 수 있는 점은 나머지 값에 의해 파티션 위치가 결정되기 때문에:파티션 키는 항상 정수 타입의 칼럼이거나 정수를 반환하는 표현식만 사용할 수 있다.파티션의 개수 변경 시 테이블 전체 레코드의 재분배 작업이 필요하다.파티션 개수가 변경되면 결과값 % 파..
[MySQL] 파티션의 크기에 따른 open_files_limit 시스템 변수 설정하기
·
MySQL
open_files_limit 시스템 변수MySQL에서는 일반적으로 테이블을 파일 단위로 관리하기 때문에 MySQL 서버에서 동시에 오픈된 파일의 개수가 많아질 수 있다.이것을 제한하기 위한 시스템 변수가 open_files_limit 이다.이 시스템 변수의 설정 값으로 동시에 오픈할 수 있는 적절한 파일의 개수를 설정할 수 있다. 파티션되지 않은 일반 테이블은 테이블 1개당 오픈된 파일의 개수가 2~3개 수준이다.하지만 파티션 테이블에서는 (파티션의 개수 * 2~3)개가 된다. (기하급수적으로 증가할 가능성이 있음) 예를 들어 파티션이 1024개 포함된 테이블이 있다고 할 때쿼리가 적절히 파티션 프루닝*으로 최적화되어 1024개의 파티션 가운데 2개의 파티션만 접근해도 된다고 하더라도 일단 동시에 모든..
[MySQL] NOWAIT 옵션으로 대기 시간 없이 트랜잭션 처리하기
·
MySQL
NOWAIT 옵션MySQL 8.0 미만의 버전에서는 누군가가 레코드를 잠그고 있다면 다른 트랜잭션에서 그 잠금이 해제될 때까지 기다려야 했다.잠금이 해제되는 것을 기다리다보면 시스템 변수에 의해 설정된 시간동안 기다렸다가 에러 메시지를 받게 되었다. 하지만 MySQL 8.0 이상의 버전에서는 NOWAIT 옵션을 사용하면 레코드가 잠겨진 상태일 때 그냥 무시하고 즉시 에러를 반환하여, 응용 프로그램에서 다른 처리를 수행하거나 다시 트랜잭션을 시작하도록 구현할 수 있다. BEGIN;SELECT * FROM employees WHERE emp_no=10001 FOR UPDATE;# FOR UPDATE 으로 다른 트랜잭션이 emp_no=10001 사원의 정보를 변경하지 못하게 막음... 연산 ...UPDATE ..