전체 글 269

MySQL InnoDB 스토리지 엔진 아키텍처

InnoDB 스토리지 엔진 레코드 기반의 잠금을 제공하여 높은 동시성 처리와 안정적이고 뛰어난 성능을 가진다. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 프라이머리 키를 이용한 범위 스캔은 굉장히 빨리 처리된다. 외래 키 지원 스토리지 엔진 레벨에서 지원하는 기능. 부모 자식 테이블 모두 해당 컬럼에 인덱스가 생성이 필요하며 변경 시에 부모 테이블이나 자식 테이블에 데이터가 있는 지 체크하는 작업이 필요하여 잠금이 여러 테이블로 전파되고 데드락 발생 가능성이 있기 때문에 외래 키 존재 여부에 주의하는 것이 좋다. MVCC (Multi V..

DB/MySQL 2021.12.30

MySQL 아키텍쳐

MySQL 서버 아키텍쳐 구조 스토리지 엔진 API SQL 문장을 분석하고 처리하여 디스크에 데이터를 쓰거나 읽는 등의 중요 역할을 담당한다. 핸들러 API 스토리지 엔진에 읽기 혹은 쓰기를 요청하는 핸들러 요청을 의미한다. MySQL 스레드 구조 MySQL은 스레드를 기반으로 작업을 처리한다. 1. 포그라운드 스레드 (클라이언트 스레드) 서버에 접속한 클라이언트 수만큼 존재하며 사용자가 요청하는 쿼리를 처리한다. 사용자가 연결을 종료하면 해당 포그라운드 스레드는 스레드 캐시로 돌악나다. 포그라운드 스레드는 MySQL의 데이터 버퍼나 캐시로부터 데이터를 가져오며 이에 없는 경우 직접 디스크 데이터 혹은 인덱스 파일로 부터 읽어서 작업을 처리한다. MyISAM은 쓰기 작업까지 포그라운드 스레드에서 진행되지..

DB/MySQL 2021.12.29

MySQL 사용자 및 권한

사용자 식별 'id_name'@'127.0.0.1' (IP 주소) 'id_name'@'%' (모든 주소) 시스템 계정과 일반 계정 시스템 계정은 다음 작업이 가능하다. 계정 관리 (새로운 계정 생성, 기존 계정 삭제, 권한 부여 및 제거) 세션 강제 종료 혹은 세션에서 수행되는 쿼리 강제 종료 스토어드 프로그램 생성 시 DEFINER를 타 사용자로 설정 잠겨있는 시스템 계정 (ACCOUNTLOCKED=Y) 다음 계정들은 시스템 계정으로 로그인이 불가능한 기본 계정이다. 'mysql.sys'@'localhost' : 기본으로 내장된 sys 스키마의 객체들의 DEFINER로 사용되는 계정 'mysql.session'@'localost' : MySQL 플러그인이 서버로 접근할 때 사용하는 계정 'mysql.i..

DB/MySQL 2021.12.23

MySQL 시스템 변수

MySQL 서버가 시작할 때 앞으로 어떻게 기동될 지 정의하는 변수 시스템 변수 확인 SHOW GLOBAL VARIABLES; MySQL 서버 시스템 변수관련 페이지 https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html MySQL :: MySQL 8.0 Reference Manual :: 5.1.5 Server System Variable Reference MySQL 8.0 Reference Manual / ... / MySQL Server Administration / The MySQL Server / Server System Variable Reference PREV HOME UP NEXT dev.mysql.com ..

DB/MySQL 2021.12.20

[More Effective C#] 4장 병렬 처리

아이템 35. PLINQ가 병렬 알고리즘을 구현하는 방법을 이해하라 AsParallel()로 생성되는 병렬 버전의 순회 타입 ParallelEnumerable와 관련된 기능을 알아본다. LINQ to Objects로 실행되는 예제를 위주로 알아본다. PLINQ는 LINQ to SQL이나 EntitiyFramework 알고리즘을 병렬화 하는 데 별로 도움이 안 된다. 어차피 쿼리를 병렬 처리하기 위해 데이터 베이스 엔진의 병렬 처리 기능을 사용하기 때문이다. public static void PLINQ_Ex1() { List data = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 순차 순회 var nums = data.Where(m => m < 150).Select(n..

C#/Advanced C# 2021.12.18

[C# Thread] BackgroundWorker 클래스

System.ComponentModel.BackgroundWorker 클래스 백그라운드에서 동작하는 스레드를 사용하는 스레드 풀을 사용하여 작업을 실행할 수 있는 클래스 내부적으로 System.Threading.Thread.QueueUserWorkItem() 함수를 이용하여 작업을 실행한다. 백그라운드 스레드가 예외를 던지면 전체 어플리케이션이 종료할 수 있다. BackgroundWorker 는 백그라운드에서 실행되는 작업에서 발생하는 취소, 예외나 진행상황을 포그라운드(Foreground) 스레드에 전달할 수 있다. 따라서 스레드간 커뮤니케이션을 가능하게한다. 작업의 실행 DoWork 속성에 실행할 작업의 대리자를 등록한다. RunWorkerAsync()는 등록된 작업을 실행한다. System.Thre..

C#/Advanced C# 2021.12.15

[More Effective C#] 3장 태스크 기반 비동기 프로그래밍

아이템 27. 비동기 작업에는 비동기 메서드를 사용하라 public static async Task SomeMethodAsnyc() { Console.WriteLine("SomeMethod Begins..."); Task assignedTask = AssignedTaskBegin(); var result = await assignedTask; Console.WriteLine("SomeMethod Ends"); } 비동기 메서드는 비동기 작업을 포함하는 메서드를 의미한다. Task assignedTask = AssignedTaskBegin(); 라인에서 비동기 작업이 시작되고 해당 결과를 전달받을 수 있는 Task 객체를 반환한다. 비동기 메서드의 async-await 구문은 기본적으로는 해당 메서드가 동..

C#/Advanced C# 2021.12.13

[More Effective C#] 2장 API 설계 (2)

아이템 20. 이벤트가 런타임 시 객체 간의 결합도를 증가시킨다는 것을 이해하라 이전 이벤트 핸들러 패턴의 예시로 만든 SystemChannel 클래스를 본다. public class SystemChannel { private Channel curChannel; public event EventHandler OnChanged { add { OnChanged += value; } remove { OnChanged -= value; } public void ChangeChannel(channel c) { // 새로운 채널 할당으로 이벤트를 발생시킨다. var oldChannel = curChannel; curChannel = c; var args = new ChannelChangedEventArgs(oldC..

C#/Advanced C# 2021.12.12

[More Effective C#] 2장 API 설계 (1)

아이템 11. API에는 변환 연산자를 작성하지 말라 변환 연산자 Conversion Operator, 대체가능 한 클래스로 변환하는 것을 의미한다. 어떤 타입이든 System.Object 타입으로 변환 가능하다. 인터페이스를 구현한 클래스는 인터페이스로 베이스 클래스를 상속한 클래스는 베이스 클래스로 대체 가능하다. public class Circle : Shape { private Coord center; private int radius; public Circle(Coord c, int r) { this.center = c; this.radius = r; } static public implicit operator Ellipse(Circle c) { return new Ellipse(c.center..

C#/Advanced C# 2021.12.12

[More Effective C#] 1장 데이터 타입

아이템 1. 접근 가능한 데이터 멤버 대신 속성을 사용하라 속성(Property)는 멤버 변수를 접근하는 방법을 제공하며 메서드로 구현된 요소이다. get; set;에 접근 지정자를 지정할 수 있고 OOP의 은닉성을 유지할 수 있다. 속성을 통해 해당 변수의 접근을 통제하고 읽고 쓰는 방식을 한 곳에 관리할 수 있다. public class Card { public Name { get; set; } } C#의 암묵적 속성을 사용하면 컴파일러는 해당 클래스의 private 필드에 name이라는 멤버 변수를 정의해준다. get; set; 키워드는 해당 멤버 변수를 접근해줄 수 있는 메서드를 각각 생성하여 속성을 통해 쉽게 사용할 수 있도록 한다. 속성(혹은 인덱서)는 ref나 out 매개변수가 있는 메서드에..

C#/Advanced C# 2021.12.04