파이썬 알고리즘 : 프로세스

2023년 10월 11일 알고리즘 문제풀이 문제 1 프로세스 문제 링크 1차 시도 나의 생각 프로세스가 담긴 배열에서 첫번째가 우리가 알고싶은 프로세스 인지 아닌지, 또 가장 높은 우선순위를 지녀 실행될 차례인지, 아닌지로 구분하였다. location은 현재 우리가 알고싶은 프로세스의 index이고, answer는 몇번째로 실행되었는지를 의미한다. 알고 싶은 프로세스 관심 없는 프로세스 최우선순위 answer 출력 popleft() 한다. 실행되었기 떄문에 answer 1 증가 차우선순위 popleft()하여 맨 뒤로 보낸다. location도 맨 뒤로 설정한다. popleft()후 맨 뒤로 보낸다. locaion 1 감소 결과 정답 ...

2023년 10월 11일 · 1 분 · 배준수

클러스터링 인덱스

책너두 6기 26일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.267 ~ p.276 내용정리 08 인덱스 8.6.2 함수를 이용한 인덱스 다음과 같이 테이블의 구조를 변경하지 않고, 함수를 직접 사용하는 인덱스를 생성할 수 있다. 1 2 3 4 5 6 7 create table user( user_id BIGINT, first_name VARCHAR(10), last_name VARCHAR(10), PRIMARY KEY (user_id), INDEX ix_fullname ((concat(first_name,' ',last_name))) ); 함수를 직접 사용하는 인덱스는 테이블의 구조는 변경하지 않고, 검색을 빠르게 만들어준다. 제대로 활용하려면 반드시 조건절에 함수 기반 인덱스에 명시된 표현식이 그대로 사용돼야 한다. ...

2023년 10월 10일 · 2 분 · 배준수

전문 검색 인덱스

책너두 6기 25일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.258 ~ p.266 내용정리 08 인덱스 8.5 전문 검색 인덱스 현재까지 공부한 인덱스 알고리즘은 크지 않은 데이터나 이미 키워드화한 작은 값에 대한 인덱싱 알고리즘이다. 문서 전체에 대한 분석과 검색을 위한 이러한 인덱싱 알고리즘을 전문 검색(Full Text search) 인덱스 라고 한다. 이는 일반화된 기능의 명칭이다. 8.5.1 인덱스 알고리즘 전문 검색에서는 문서 본문의 내용에서 사용자가 검색하게 될 키워드를 분석해 내고, 빠른 검색용으로 사용할 수 있게 이러한 키워드로 인덱스를 구축한다. ...

2023년 10월 9일 · 3 분 · 배준수

B-Tree와 R-Tree

책너두 6기 24일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.247 ~ p.257 내용정리 08 인덱스 8.3.7 B-Tree 인덱스의 가용성과 효율성 쿼리의 where 조건이나 group by, 또는 order by 절이 어떤 경우에 인덱슬르 사용할 수 있고 어떤 방식으로 사용할 수 있는지 식별할 수 있어야 한다. 8.3.7.1 비교 조건의 종류와 효율성 다중 칼럼 인덱스에서 각 칼럼의 순서와 그 칼럼에 사용된 조건이 동등 비교("=")인지 아니면 크다(">") 또는 작다("<") 같은 범위 조건인지에 따라 각 인덱스의 칼럼의 활용 형태가 달라지며, 그 효율 또한 달라진다. ...

2023년 9월 30일 · 4 분 · 배준수

부록 A 동시성2 (4)

책너두 5기 48일차 로버트 C. 마틴의 클린코드 p. 437~ p.446 내용정리 부록 A 동시성 2 다중 스레드 코드 테스트 변수의 현재 값을 기억한다. 스레두 두 개를 새엉하여 각 스레드가 해당 변수에 관한 메서드를 호출한다. 의도에 맞게 값이 변경되었는지 확인한다. 의도와 다르게 변한것이 확인될 때까지 반복한다. 위와 같은 테스트는 아주 드물게 문제가 발생하기 때문에, 일억 번은 돌려야 한다. 따라서 많은 시간이 소모된다. 이를 대체하기 위한 방법들은 다음과 같다. 몬테 카를로 테스트 ...

2023년 9월 30일 · 1 분 · 배준수

다중 칼럼 인덱스

책너두 6기 23일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.237 ~ p.246 내용정리 08 인덱스 8.3.4.4 인덱스 스킵 스캔 데이터베이스 서버에서 인덱스의 핵심은 값이 정렬돼 있다는 것이며, 이로 인해 인덱스를 구성하는 칼럼의 순서가 매우 중요하다. 기존에 루스 인덱스 스캔이 비슷한 최적화를 수행했지만 새로 도입된 인덱스 스킵 스캔은 용도가 훨씬 넒어졌다. 단점 Where 조건절에 조건이 없는 인덱스의 선행 칼럼의 유니크한 값의 개수가 적어야 함 : 개수가 많으면 인덱스에서 스캔해야 할 시작 지점을 검색하는 작업이 많이 필요해져 쿼리의 처리 성능이 오히려 더 느려질 수 있다. 쿼리가 인덱스에 존재하는 칼럼만으로 처리 가능해야 함(커버링 인덱스) : 이후 버전에서 개선될 것으로 보임 8.3.5 다중 칼럼(Multi-column)인덱스 현재 까지는 1개의 칼럼만 포함된 인덱스 두 개 이상의 칼럼으로 구성된 인덱스를 다중 칼럼 인덱스(복합 칼럼 인덱스)나 “Concatenated Index"라고 함 다중 칼럼 인덱스에서는 인덱스 내에서 각 칼럼의 위치(순서)가 상당히 중요하다. 8.3.6 B-Tree 인덱스의 정렬 및 스캔 방향 인덱스의 키 값은 항상 오름차순이거나 내림차순으로만 정렬되어 저장된다. 8.3.6.1 인덱스의 정렬 인덱스를 생성하는 시점에 인덱스를 구성하는 각 칼럼의 정렬을 오름차순 / 내림차순 으로 설정 가능 정렬 순서를 혼합할 수 있음. 8.3.6.1.1 인덱스 스캔 방향 인덱스 생성 시점에 오름차순 또는 내림차순으로 정렬이 결정되지만 쿼리가 그 인덱스를 사용하는 시점에 인덱스를 읽는 방향에 따라 오름차순 또는 내림차순 정렬 효과를 얻을 수 있다. 8.3.6.1.2 내림차순 인덱스 인덱스 역순 스캔이 인덱스 정순 스캔에 비해 느리다. 인덱스를 내림차순 정렬하는 쿼리가 소량의 레코드에 드물게 실행되는 경우라면 내림차순 인덱스를 굳이 고려할 필요는 없다. 많은 레코드를 조회하면서 빈번하게 실행된다면 내림차순 인덱스가 더 효율적일 수도 있다. 많은 쿼리가 인덱스의 앞쪽만 또는 뒤쪽만 집중적으로 읽어서 인덱스의 특정 페이지 잠금에서 병목이 예상된다면 쿼리에서 자주 사용되는 정렬 순서대로 인덱스를 생성하는 것이 잠금 병목 현상을 완화하는데 도움이 된다.

2023년 9월 29일 · 2 분 · 배준수

부록 A 동시성2 (3)

책너두 5기 47일차 로버트 C. 마틴의 클린코드 p. 429~ p.436 내용정리 부록 A 동시성 2 작업 처리량 높이기 동기화 영역은 언제나 작을수록 좋다. 작업 처리량 계산 - 단일 스레드 환경 다음을 가정한다. 페이지를 읽어오는 평균 I/O 시간 : 1초 페이지를 분석하는 평균 처리 시간: 0.5초 처리는 CPU 100%를 사용, I/O는 CPU 0% 사용 스레드 하나가 N 페이지를 처리한다면 총 실행 시간은 1.5초 * N이다. 작업 처리량 계산 - 다중 스레드 환경 3개의 스레드를 사용한다면? 페이지 읽기 한 번은 페이지 분석 두 번과 겹침이 가능하므로 일 초마다 두 페이지를 처리한다. 따라서 단일스레드보다 처리율이 세 배 높다. ...

2023년 9월 29일 · 2 분 · 배준수

B-Tree 인덱스를 통한 데이터 읽는 방법

책너두 6기 22일차 백은빈, 이성욱의 Real MySQL8.0 1권 p.228 ~ p.236 내용정리 08 인덱스 8.3.3.3 선택도(기수성) 인덱스에서 선택도(Selectivity) 또는 기수성(Cardinality)은 거의 같은 의미로 사용되며, 모든 인덱스 키 값 가운데 유니크한 값의 수를 의미한다. 인덱스 키 값 가운데 중복이 많을수록 기수성과 선택도는 낮아진다. 선택도가 높을수록 검색 대상이 줄어서 빠르게 처리된다. 선택도가 좋지 않다고 하더라도 정렬이나 그루핑과 같은 작업을 위해 인덱스를 만드는 것이 훨씬 나은 경우도 많다. 인덱스에서 유니크한 값의 개수는 인덱스나 쿼리의 효율성에 큰 영향을 미친다. 8.3.3.4 읽어야 하는 레코드의 건수 인덱스를 통해 테이블의 레코드를 읽는 것은 인덱스를 안 거치는 것 보다 높은 비용이 든다. 100만 중 50만을 읽어야하는 쿼리가 있다면 무엇이 효율적일지 판단해야 한다. 테이블 모두 읽고 50만개 버리기 인덱스를 통해 필요한 50만 개 읽기 8.3.4 B-Tree 인덱스를 통한 데이터 읽기 mYSQL이 인덱스를 이용하는 대표적인 방법 세 가지 ...

2023년 9월 28일 · 2 분 · 배준수

부록 A 동시성2 (2)

책너두 5기 46일차 로버트 C. 마틴의 클린코드 p. 420~ p.428 내용정리 부록 A 동시성2 라이브러리를 이해하라 Executor 프레임워크 스레드 풀링으로 정교한 실행을 지원하는 프레임워크 스레드 풀을 관리하고, 풀 크기를 자동으로 조정하며, 필요하다면 스레드를 재 사용 스레드를 차단하지 않는(non blocking) 방법 최신 프로세서는 거의 지원. CAS(Compare and Swap)라 불리는 연산을 지원 다중 스레드 환경에서 안전하지 않은 클래스 SimpleDateFormat 데이터베이스 연결 java.util 컨테이너 클래스 서블릿 메서드 사이에 존재하는 의존성을 조심하라 두 스레드가 서로를 간섭해 예외가 발생할 가능성이 있다. 해결방안 실패를 용인한다. 클리언트를 바꿔 문제를 해결한다. 즉, 클라이언트-기반 잠금 메커니즘을 구현한다. 서버를 바꿔 문제를 해결한다. 서버에 맞춰 클라이언트도 바꾼다. 즉, 서버-기반 잠금 메커니즘을 구현한다. 실패를 용인한다. 떄로는 실패해도 괜찮도록 프로그램을 조정할 수 있다. ...

2023년 9월 28일 · 1 분 · 배준수

부록 A 동시성2 (1)

책너두 5기 45일차 로버트 C. 마틴의 클린코드 p. 413~ p.419 내용정리 가능한 실행 경로 1 2 3 4 5 6 7 public class IdGenerator { int lastIdUsed; public int incrementValue() { return ++lastIdUsed; } } 스레드 하나가 IdGenrator 인스턴스 하나를 사용한다고 가정하면 가능한 실행 경로, 가능한 결과도 하나다. 반환값은 lastIdUsed 값과 동일하다. 두 값 모두 메서드를 호출하기 전보다 1이 크다. 스레드가 두 개라면? 그래서 각 스레드가 incrementValue 메서드를 한 번씩 호출한다면 결과는 어떨까? lastIdUsed 초깃값을 93으로 가정하면 결과는 다음 중 하나이다. ...

2023년 9월 27일 · 1 분 · 배준수