1. Mode bit

사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치

1 사용자모드 : 사용자 프로그램 수행

0 모니터모드 : OS 코드 수행

 

- 보안을 해칠 수 있는 중요한 명령어는 모니터 모드(OS)에서만 수행 가능 == 특권명령

- Interrupt 나 Exception 발생시 하드웨어가 mode bit 을 0으로 바꾼다

- 사용자 프로그램에게 CPU를 넘기기 전에 mode bit 을 1로 바꾼다

 

2. Timer

- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 interrupt 를 발생시킨다

- 타이머는 매 클럭 틱 마다 1씩 감소

- 타이머 값이 0이 되면 타이머 interrupt 발생 

- CPU를 특정 프로그램이 독점하는 것으로부터 보호

- 타이머는 time sharing을 구현하기 위해 널리 이용된다

- 타이머는 현재 시간을 계산하기 위해서도 사용된다

 

3. Device Controller

3-1. I/O device Controller

- I/O 장치유형을 관리하는 일종의 작은 CPU

- 제어 정보를 위해 control register, status register 를 가진다

- local buffer 를 가진다

- I/O는 실제 device와 local buffer 사이에서 일어난다

- Device controller는 I/O가 끝났을 경우 Interrupt 로 CPU에 그 사실을 알린다

 

Device Driver (장치구동기) : OS 코드 중 각 장치별 처리루틴 (software)

Device Controller (장치제어기) : 각 장치를 통제하는 일종의 작은 CPU (hardware)

 

※ 인터럽트(Interrupt)

인터럽트 당한 시점의 레지스터와 program counter 를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다

- Interrupt (하드웨어 인터럽트) : 하드웨어가 발생시킨 인터럽트

- Trap (소프트웨어 인터럽트) :

  Exception : 프로그램 오류

  System Call : 프로그램이 커널 함수 호출

 

인터럽트 관련 용어

- 인터럽트 벡터

  해당 인터럽트의 처리 루틴 주소를 가지고 있음

  : 함수의 주소 값을 가지고 있는 일종의 테이블

- 인터럽트 처리 루틴 (=Interrupt Service Routine, 인터럽트 핸들러)

  해당 인터럽트를 처리하는 커널 함수

  : 인터럽트마다 처리하는 작업내용이 다르므로 각각의 인터럽트마다 어떤 작업을 수행해야 하는지가 작성되어 있는 코드

 

입출력의 수행

모든 입출력 명령은 특권 명령

사용자 프로그램이 I/O 하는 방법 : 시스템콜(System Call)

1) 인터럽트 라인 세팅

2) CPU는 실행중이던 인스트럭션을 실행한 후 interrupt 확인

3) mode bit 0 으로 바뀜

4) 운영체제에게 CPU 제어권이 넘어감

5) device controller 에게 I/O 데이터 요청

6) CPU는 I/O 를 기다리지 않고, 다른 인스트럭션 실행

7) I/O 입력

8) device controller가 인터럽트 라인 세팅

9) CPU는 실행중이던 인스트럭션을 실행한 후 interrupt 확인

10) mode bit 0으로 바뀜

11) 운영체제에게 CPU 제어권이 넘어감

12) device controller로부터 buffer에 저장된 데이터를 운영체제가 받아옴

13) I/O를 요청했던 인스트럭션의 메모리영역에 buffer 데이터 저장

 

* CPU는 레지스터 중 program counter 가 가르키는 메모리 주소(인스트럭션)을 실행

* program counter 가 가리키는 메모리 주소를 실행하기 전에 interrupt line 을 확인

* mode bit 이 0일 땐 OS 가 CPU 를 가지고 있으므로 모든 인스트럭션 실행이 가능

* mode bit 이 1일 땐 사용자 프로그램이 CPU 를 가지고 있으므로 실행 불가한 인스트럭션이 존재(인터럽트를 걸어 운영체제에게 서비스 요청)

인스트럭션 1개는 4byte

 

입출력 방식

동기식 입출력 : I/O 요청 후 입출력 작업이 완료된 후, 사용자 프로그램에 제어가 넘어감

비동기식 입출력 : I/O 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감

* I/O 완료여부는 interrupt로 알린다.

 

DMA (Direct Memory Access)

- 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용

- CPU의 중재 없이 device controller 가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송

- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴

* CPU에 인터럽트를 매번 걸지 않아 효율이 증가

 

저장장치 계층구조

* Volatility 휘발성

 

프로그램 실행시 메모리 로드

File System --> virtual memory --(Address transaction 논리메모리 주소를 물리 메모리 주소로 변환)--> physical memory

1) 프로그램 실행시 실행된 각각의 프로그램의 Address space 를 virtual memory 에 생성

2) physical memory 에 virtual memory 의 필요한 일부만 올림

3) 불필요한 경우 Swap area(메모리의 한계로 메모리 연장을 위한 공간으로 사용) 에 저장

 

 

커널 주소 공간의 내용

 

※ 이화여대 반효경 교수님의 운영체제 강의내용 정리 (kocw.net)

반응형

1. 운영체제 (Operating System) 란?

-컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층

-좁은 의미의 운영체제 : 커널(Kernel), 운영체제의 핵심 부분으로 메모리에 상주하는 부분

-넓은 의미의 운영체제 : 커널 뿐만 아니라 각종 주변 시스템 유틸리티 포함한 개념

 

 

2. 운영체제의 목적

2-1) 효율적인 컴퓨터 시스템의 자원 관리

- 프로세서, 기억장치, IO 장치 등의 효율적 관리

 사용자간의 형평성 있는 자원 분배

 주어진 자원으로 최대한의 성능을 내도록

- 사용자 및 운영체제 자신의 보호

 프로세스, 파일, 메시지 등을 관리

2-2) 컴퓨터 시스템을 편리하게 사용할 수 있는 환경 제공

- 하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행

 

 

3. 운영체제의 분류

3-1) 동시 작업 가능 여부에 따른 분류

- 단일 작업(single tasking) : 한 번에 하나의 작업만 처리

ex) MS-DOS

- 다중 작업(multi tasking) : 동시에 두개 이상의 작업 처리

ex) UNIX, MS windows

 

3-2) 사용자의 수에 따른 분류

- 단일사용자(single user)

ex) MS-DOS, MS Windows

- 다중사용자(multi user) : 동시에 여러명의 사용자가 하나의 컴퓨터에 접속하여 사용, 더 세밀한 자원관리 요구됨

ex) UNIX

 

3-3) 처리 방식에 따른 분류

- 일괄처리(Batch Processing) 

작업 요청의 일정량을 모아서 한 번에 처리 (ex: OMR 카드)

- 시분할(Time Sharing)

여러 작업을 수행할 때 컴퓨터 처리 능력을 일정 시간 단위로 분할하여 사용 (대부분의 OS)

CPU의 시간을 분할하여 나누어 쓴다는 의미

- 실시간(Real Time)

정해진 시간 안에 작업이 반드시 종료되는게 보장되어야 하는 시스템을 위한 OS (반도체/미사일/원자로 등)

※ 실시간 시스템의 개념 확장

Hard realtime system(경성 실시간 시스템) : 시간이 엄밀하게 지켜져야 하는 시스템(ex:미사일)

Soft realtime system(연성 실시간 시스템) : 시간이 지켜져야 하지만 엄격하게 지켜질 필요는 없는 시스템(ex: 영사기)

 

4. 운영체제의 예

- UNIX : 코드 대부분을 C언어로 작성, 높은 이식성, 소스 코드 공개, 프로그램 개발에 용이 

ex) Linux, Solaris

- DOS(Disk Operating System) : MS사가 1981년 개인 PC를 위해 개발, RAM 이 640KB로 제한

- MS Windows : MS 사의 GUI 기반 운영체제

 

 

※ 이화여대 반효경 교수님의 운영체제 강의내용 정리 (kocw.net)

반응형

1. mysql-server 설치

>sudo apt-get update  //apt-get 업데이트

>sudo apt-get install mysql-server  //mysql-server 설치

 

2. /etc/mysql/ 밑의 conf 에서

binding ip 0.0.0.1 로 수정하여 외부에서도 접속 가능토록 수정

 

3. 실행 및 종료

>sudo /etc/init.d/mysql restart //재시작

>sudo systemctl start mysql //시작

>sudo systemctl enable mysql //서버 재시작시 mysql 자동 시작되도록 등록)

>sudo systemctl stop mysql

 

4. 유저 관리 및 DB 권한 주기

3-1) 데이터베이스 생성

>mysql -u root -p //root 로 접속

>CREATE DATABASE bootmybatis; //bootmybatis 이름으로 database 생성

>SHOW DATABASES; //databases 목록 조회

※ 유저 삭제

>DROP DATABASE dbname;

 

3-2) 유저 생성 및 접근 허용 IP 지정

>CREATE USER 'developyo'@'%' IDENTIFIED BY 'password';

//암호를 'password'로 하는 developyo 계정을 생성, 해당 사용자는 어떤 ip 에서도('%') 접속이 가능

>ALTER USER ''root'@'localhost' IDENTIFIED BY 'password';

//암호를 'password'로 하는 root 계정을 수정, 해당 사용자는 localhost에서만 접속이 가능

>FLUSH PRIVILEGES;  //commit

>SELECT user, host, password FROM mysql.user; //유저, 접근허용ip, 암호 확인

※ 유저 삭제

>DROP USER 'id'@'host';

 

3-3) 데이터베이스에 권한 부여

>GRANT ALL PRIVILEGES ON bootmybatis.* to developyo@'%';

>FLUSH PRIVILEGES;  //commit

>SHOW GRANTS FOR 'developyo'@'%'; //developyo 갖고있는 권한 확인

 

 

[호스트(window)에서 vm 게스트(우분투) mysql 에 접속하기]

1) NAT 설정 브릿지로 바꾸기

설정(settings) > 네트워크(network) > 다음에 연결됨 : 어댑터에 브리지 (attached to: Bridged Adapter) 로 변경

2) 터미널에서 ip 확인

>ifconfig 

3) mysql client 에서 위의 ip로 연결

 

참고 :

https://dejavuqa.tistory.com/317

https://bugwhale.com/virtualbox-bridged-adapter-error/

 

반응형

람다의 메소드 참조

메소드 참조는 매개변수의 정보 및 리턴 타입을 알아내어 람다식에 불필요한 매개 변수를 제거하기 위함

 

[기본문법]

https://developyo.tistory.com/190

 

[메소드참조]

1. static 메소드참조

public static int abs(int a){}   //Math class 내의 abs()
Math::abs  //위와 같다

Math.abs(..)와 같은 static 메소드를 Math::abs 로 표현 할 수 있다.

※ Math::abs()와 같이 ()를 붙이지 않는것을 주의.

 

위와 같은 람다의 static 메소드 참조를 사용하여 인터페이스를 구현할 경우

아래와 같이 static 메소드를 리턴하도록 구현 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package Java.Lamda.methodReferences;
 
public class MethodRef_1_Basic {
 
    public static void main(String[] args){
        
        /** 1.기본 사용법 */
        //String.valueOf() 를 그대로 사용하여 리턴하는 람다
        FuncI funcI = (Object obj) -> String.valueOf(obj);
        System.out.println(funcI.anony("HELLO"));
        
        //위 경우 아래와 같이 메소드 참조가 가능
        FuncI funcI_ref_method = String::valueOf;
        System.out.println(funcI_ref_method.anony(100));
        
        //절대값을 구해주는 Math.abs 를 참조 
        System.out.println("abs ref : "+convert(-1, Math::abs));
    
    }
 
    @FunctionalInterface
    interface FuncI {
        String anony(Object obj);
    }
    
    @FunctionalInterface
    interface MathAbs {
        int anony(int obj);
    }
    
    public static int convert(int number, MathAbs func) {
        return func.anony(number);
    }
}
cs

[실행결과]

HELLO
100
abs ref : 1

 

2. 생성자 참조

() -> new String()    
String::new           //위와 같다

위와 같이 생성자를 리턴하는 경우 타입::new 와 같이 표현 할 수 있다.

아래는 생성자 참조를 이용한 예제.

[Person.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package Java.Lamda.methodReferences;
 
public class Person {
    
    private String name;
    private String gender;
 
    public Person() {
    }
    public Person(String name) {
        this.name=name;
    }
    public Person(String name, String gender) {
        this.name=name;
        this.gender = gender;
    }
 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
 
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}
 
cs

[클라이언트]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package Java.Lamda.methodReferences;
 
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
 
public class MethodRef_2_Constructor {
 
    public static void main(String[] args){
 
        Func<String, Person> func1 = Person::new;
        Person person = func1.create("pyo");
        System.out.println(person.getName());
        
        Func2<StringString, Person> func2 = Person::new;
        Person person2 = func2.create("pyo""male");
        System.out.println(person2.getName() + "/" + person2.getGender());
 
    }
    
    @FunctionalInterface
    interface Func<T, R>{
        R create(T t);
    }
    @FunctionalInterface
    interface Func2<T, U, R>{
        R create(T t, U u);
    }
}
 
cs

위의 Func<T, R>, Func2<T, U, R>과 비슷한 역할을 하는

Function<T, R>, BiFunction<T, U, R> functionalInterface가 java.util 패키지로 제공된다.

[실행결과]

pyo
pyo/male

 

3. 인스턴스 참조

()->a.toString();
a::toString        //위와 같다

위와 같이 인스턴스의 메소드를 리턴하는 경우 인스턴스::메소드 와 같이 표현 할 수 있다.

아래는 인스턴스 참조를 사용한 예.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package Java.Lamda.methodReferences;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
 
public class MethodRef_4_Instance {
 
    public static void main(String[] args){
        Person person = new Person("pyo");
        Func func = person::getName;
        System.out.println(func.anony());
        
    }
    
    @FunctionalInterface
    interface Func {
        String anony();
    }
}
 
cs

 

참고:

https://futurecreator.github.io/2018/08/02/java-lambda-method-references/

https://imcts.github.io/java-method-reference/

 

반응형

'back > java' 카테고리의 다른 글

HttpUrlConnection 모듈 (리펙토링) : 빌더패턴과 프록시패턴 사용  (0) 2020.02.21
[Java] java reflection  (0) 2020.02.20
[Java] lambda 람다 1 (기본문법)  (0) 2020.01.15
[Java] Generic 제네릭  (0) 2019.12.28
[Java] Compile  (0) 2019.12.22

 

"소프트웨어 장인정신"

소프트웨어 장인정신은 소프트웨어 개발자가 스스로가 선택한 커리어에 책임감을 가지고, 지속적으로 새로운 도구와 기술을 익히며 발전하겠다는 마음가짐이다. 소프트웨어 장인정신은 책임감, 프로페셔널리즘, 실용주의 그리고 소프트웨어 개발자로서의 자부심

 

"애자일"

: 단일 개념이 아닌 서로 다른 여러 맥락에 따른 방법론과 테크닉의 조합

: 짧은 피드백 주기의 중요성

 

"카타"

: 품세라는 뜻으로 일본 무예 훈련에서 나온 용어

: 작은 훈련용 코딩

 

"펫 프로젝트"

: 자가 학습/훈련 용 프로젝트

 

"어디로 가고있지 모르고 있다면 결국 가고싶지 않은 곳으로 간다"

: 방향의 중요성

: 방향을 잡기위한 자기계발

 

"나쁜 코드는 암과도 같다"

: 리펙토링의 중요성

: TDD의 중요성

 

 

2020.02.01

반응형

jdk 1.8 이상부터 지원.

함수형 프로그래밍을 가능케 함.

1회용 익명 클래스가 필요할 때 람다를 사용하여 코드를 줄일 수 있음.

 

[기본 문법 1 : 인수가 없는 경우]

접근제한자, 리턴타입 생략 가능

public void method(){
}

() -> {
}

* @FunctionalInterface : 추상메소드가 한개만 존재하는 인터페이스

* lambda는 Functional Interface 에만 사용이 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package Java.Lamda.basic;
 
public class Main1 {
        
    public static void main(String[] args) {
 
        //기존방법대로 익명클래스를 사용한 구현
        Interface i = new Interface() {
            @Override
            public void sayHello() {
                System.out.println("HELLO! in anonymous class");
            }
        };
        i.sayHello();
        
        //lambda를 사용한 익명클래스 구현        
        //lambda 는 Functional Interface 에만 사용이 가능
        Interface lamda = () -> {
            System.out.println("HELLO! in anonymous method(lambda)");
        };
        lamda.sayHello();
    }
    
    //@FunctionalInterface 는 abstract method 가 오직 1개여야 한다.
    @FunctionalInterface
    interface Interface {
        void sayHello();
    }
}
 
cs

[결과]

HELLO! in anonymous class 
HELLO! in anonymous method(lambda)

 

[기본 문법 2 : 인수가 존재하는 경우]

인수 타입 생략이 가능.

return 생략 가능(함수 내 처리가 return 문이 전부인 경우)

public void method(int x, int y){
   return x+y;
}

(x, y) -> x+y;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package Java.Lamda.basic;
 
public class Main3 {
    
    public static void main(String[] args) {
        
        Calculation add = (x, y) -> {
            return x+y;
        };
        System.out.println(calculate(add23));
        
        
        Calculation multiply = (x, y) -> x*y;
        System.out.println(calculate(multiply, 23));
    }
    
    static Integer calculate(Calculation operation, Integer x, Integer y) {
        return operation.apply(x, y);
    }
    
    @FunctionalInterface
    interface Calculation {
        Integer apply(Integer x, Integer y);
    }
    
    class Calculator {
        Integer add(Calculation cal, Integer x, Integer y) {
            return cal.apply(x, y);
        }
    }
}

 

 

cs

[결과]

5
6

 

[기본 문법 3 : static 메소드, default 메소드]

jdk 1.8 부터 interface 에서 static 메소드, default 메소드 사용이 가능.

static 메소드 : 오버라이딩 불가
default 메소드 : 오버라이딩 가능

인터페이스에 메소드라니?!

추상메소드만 가질 수 있는게 아니라니?!

인터페이스가 메소드(default 메소드)를 가질 수 있게 되면서, 추상클래스와 인터페이스가 매우 비슷해졌다.

(인터페이스를 만들 때, 공통 관심사는 default 메소드로, 나머지 메소드를 abstract 메소드로 선언하면 기존의 추상클래스와 매우 비슷하다)

자바에서도 결국 다중상속이 가능하게 된 셈이다.

그렇다면 추상클래스와 인터페이스의 차이점은 이제 더이상 없는건가?

아직 아래와 같은 차이점이 존재한다.

추상클래스 : 다중상속이 불가, 인스턴스 변수를 가질 수 있다
인터페이스 : 다중구현이 가능, 인스턴스 변수를 가질 수 없다

Calculation : interface

ExtendsCalculation : Calculation interface 상속받은 interface

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package Java.Lamda.basic;
 
public class Main4 {
 
    public static void main(String[] args) {
 
        Calculation add = (x, y) -> {
            return x+y;
        };
        add.print(23);
        Calculation.print2(23);
        System.out.println(calculate(add23));
        
        
        ExtendsCalculation multiply = (x, y) -> x*y; 
        multiply.print(23);
        System.out.println(calculate(multiply, 23));
        
    }
    
    static Integer calculate(Calculation operation, Integer x, Integer y) {
        return operation.apply(x, y);
    }
    
    @FunctionalInterface
    interface Calculation {
        Integer apply(Integer x, Integer y);
        
        default void print(Integer x, Integer y) {
            System.out.println("x : " + x);
            System.out.println("y : " + y);
        }
        
        static void print2(Integer x, Integer y) {
            System.out.println("x : " + x + ", y : " + y);
        }
    }
    
    class Calculator {
        Integer add(Calculation cal, Integer x, Integer y) {
            return cal.apply(x, y);
        }
    }
    
    @FunctionalInterface
    interface ExtendsCalculation extends Calculation{
        @Override
        default void print(Integer x, Integer y){
            System.out.println("x,y : " + x +","+ y);
        }
    }
    
}
 
cs

[결과]

x : 2
y : 3
x : 2, y : 3
5
x,y : 2,3
6

※ stackoverflow 및 각종 개발자 커뮤니티 QnA 에 Comparator Interface 구현시 람다를 어떻게 사용할 수 있냐는 질문이 꽤 많이 보인다.

1.8 에서의 Comparator 인터페이스를 들여다 보면, default 메소드 및 static 메소드 다수 존재하나 추상메소드는 오직 compare()메소드, 단 한 개 존재한다.

 

[메소드 참조]

https://developyo.tistory.com/193?category=688588

 

 

참고:

https://futurecreator.github.io/2018/07/20/java-lambda-type-inference-functional-interface/

 

반응형

'back > java' 카테고리의 다른 글

[Java] java reflection  (0) 2020.02.20
[Java] lambda 람다 2 (메소드참조)  (0) 2020.01.17
[Java] Generic 제네릭  (0) 2019.12.28
[Java] Compile  (0) 2019.12.22
[Java] Collection Framework  (0) 2019.12.21

시퀀스다이어그램/플로우차트 그리기 좋은 툴 :

무료

1. bizagi

2. https://www.draw.io/

3. https://www.websequencediagrams.com/

 

YAML file 규격 확인 

4. YAMLlint : www.yamllint.com/

 

반응형

1. git 저장소 만들기

1) git으로 관리할 (github에 올릴) 소스가 위치한 workspace 로 이동 

2) git init

※ git init 시 .git 폴더 생성되며 환경설정 (config) 파일 등이 생성됨

 

1-1. git 사용자 계정 정보 설정하기

> git config user.name "develo-pyo"

> git config user.email "jungpyo9@gmail.com"

.git/config 파일 직접 수정해도 된다 (참고)

 

2. 인덱스에 추가하기

- 추가한 파일 인덱스에 추가 : git add hellogit.java

- 제거한 파일 인덱스에 추가 : git rm hellogit.java

 

3. 인덱스 커밋하기

- 인덱스 커밋 : git commit -m "commit comment"

 

4. 원격서버 추가하기

새로운 원격서버 추가 : git remote add origin "https://github.com/develo-pyo/~.git"

이때 git repository 주소는

git hub 접속 > git repository new > 프로젝트명(경로) 작성시 나타나는 아래 화면에서 확인할 수 있다.

 

5. 원격서버에 푸시하기

- 마스터에 푸시 : git push origin master

 

참고 : https://rogerdudler.github.io/git-guide/index.ko.html

 

 

 

반응형

드래그앤드롭 설정을 양방향으로 했음에도 불구하고

호스트<>게스트간 복사붙여넣기가 되지 않을 경우

 

1. 저장소>컨트롤러:IDE >iso 이미지를 VBoxGuestAdditions.iso 로 변경

2. 우분투 실행 후 VBox_GAs_~ 클릭 후 폴더창 우측 상단의 프로그램 실행 버튼 클릭

3. 현재상태 저장 후 재시작

 

참고:

https://3dmpengines.tistory.com/1943

반응형

본 포스팅은 '기억보단 기록'을 이라는 타이틀로 유명한 'jojoldu' 님의 인덱스관련 포스팅을 공부차원에서 단순 요약한 포스팅에 불과하므로,

보다 정확한 정보 습득을 원하시는 분들은 필히 아래 링크로 이동 하시길 바랍니다.

https://jojoldu.tistory.com/243

 

[인덱스 기준]

1. 카디널리티가 높은 --> 낮은 칼럼 순서로 인덱스를 잡아야 좋다.

카디널리티가 높다 : 중복수치가 낮다 ex) 주민등록번호

카디널리티가 낮다 : 중복수치가 높다 ex) 이름

 

2. 인덱스를 잡을 때 키의 길이는 짧을 수록 좋다.

InnoDB(MySQL)에서 디스크에 데이터를 저장하는 가장 기본단위를 페이지라 하며, 인덱스 역시 페이지 단위로 관리된다.

인덱스가 저장되는 페이지는 16KB 크기로 고정되어 있다.

키의 크기가 길 수록 페이지에 저장되는 인덱스의 양은 줄어들고,

페이지에 저장된 인덱스의 양이 줄어들 수록, 조회시 더 많은 페이지를 조회해야 한다.

 

 

[인덱스 사용한 조회]

1. 복수개의 칼럼으로 인덱스를 구성했을 때, 조건절 주의사항

인덱스를 회원그룹(group), 나이(age), 성별(gender)  과 같이 잡았을 때,

아래의 쿼리는 인덱스(age)를 타지 않음

select *
from user
where age = 18

반면, 아래의 쿼리는 인덱스(group)를 탄다.

select *
from user
where group='premium'

: 첫번째 인덱스 칼럼은 조회조건에 포함되어야만 한다.

 

2. 그 외의 주의사항

1) between, like, <, > 등의 범위 조건에 사용된 칼럼은 인덱스를 타지만, 그 뒤의 인덱스 칼럼들은 인덱스로 사용되지 않음.

아래 쿼리에서 gender는 인덱스로 사용되지 않는다.

* LIKE 의 경우 'str%' 좌측 일치 패턴만 인덱스가 사용된다.

select *
from user
where group = 'premium'
and age > 18
and gender = 'M'

2) =, IN 조건으로 사용된 칼럼 뒤의 인덱스 칼럼들은 인덱스로 사용된다.

(IN은 =을 여러번 실행 시킨 것이므로)

단, IN 조건 안에 서브쿼리를 넣게 되면 성능상 이슈가 발생. (서브쿼리 외부 먼저 실행 후 IN 구절은 체크조건으로 실행되므로)

 

3) AND 연산자는 ROW 수를 줄이는 역할을 하지만 OR 연산자는 비교해야할 ROW가 더 늘어나므로 풀 테이블 스캔이 발생할 확률이 높음. 

 

4) 인덱스로 사용된 컬럼은 컬럼값 그대로 사용해야 인덱스가 사용된다.

select *
from user
where group = 'premium'
and age+1 = 18

위 쿼리는 인덱스를 타지 못한다.

위 경우, age = 18-1 과 같이 수정해야 한다.

칼럼이 문자열인데 숫자로 조회시 타입이 달라 인덱스가 사용되지 않는다.

 

5) null의 경우 where ? is null 로 인덱스 사용이 가능

일반적인 DBMS 와 달리 Mysql 에선 null 값도 인덱스로 관리

 

 

[인덱스 사용한 조회시 조회 칼럼 순서]

조회조건에 포함되어 있는지가 중요할 뿐, 반드시 인덱스 순서와 조회 칼럼 순서를 지킬 필요는 없다.

(옵티마이저가 조회 칼럼 순서를 인덱스 칼럼 순서에 맞춰 재배열 하는 과정이 추가되긴한다)

 

반응형

+ Recent posts