TIL -day 14

정상화·2023년 3월 10일
0

TIL

목록 보기
10/46
post-thumbnail

count의 원리

count는 null값을 세지 않는다.

인덱스

빠른 검색을 위한 추가 데이터

  • 장점: 검색속도 향상
  • 단점: 추가, 수정, 삭제 시 추가작업

시스템이 느려질 때 색인을 거는 것이 좋다.

유니크 인덱스

중복허용이 안된다. 보통 이런 경우 이메일, 아이디 같은 거인 경우가 많다.
이메일, 아이디로 회원을 검색하는 경우도 많으니 테이블 생성시에 인덱스를 걸어주는 편이 좋다.

일반 인덱스

중복이 된다.

예시

# 데이터베이스 a4가 존재하면 삭제
DROP DATABASE IF EXISTS a4;

# 데이터베이스 a4 생성
CREATE DATABASE a4;

# 데이터베이스 a4 선택
USE a4;

# 회원 테이블 생성, loginId, loginPw, `name`
## 조건 : loginId 칼럼에 UNIQUE INDEX 없이
# 주의 : INT(10)이 10바이트라는 강사의 설명은 잘못 되었습니다. 그냥 INT라고 쓰시면 됩니다.
CREATE TABLE `member` (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    regDate DATETIME NOT NULL,
    loginId CHAR(50) NOT NULL,
    loginPw VARCHAR(100) NOT NULL,
    `name` CHAR(100) NOT NULL
);

# 회원 2명 생성
## 조건 : (loginId = 'user1', loginPw = 'user1', `name` = '홍길동')
## 조건 : (loginId = 'user2', loginPw = 'user2', `name` = '홍길순')
INSERT INTO `member`
SET regDate = NOW(),
loginId = 'user1',
loginPw = 'user1',
`name` = '홍길동';

INSERT INTO `member`
SET regDate = NOW(),
loginId = 'user2',
loginPw = 'user2',
`name` = '홍길순';

insert into `member` (regDate, loginId, loginPw, `name`)
select now(), uuid(), 'pw', 'anonymous'
from member;

# 회원수 확인
select count(*)
from member;

# 검색속도 확인
## 힌트 : SQL_NO_CACHE
select sql_no_cache *
from `member`
where loginid = 'user1';

select sql_no_cache *
from `member`
where id = 2342;

show index from `member`;

# 유니크 인덱스를 loginID 칼럼에 걸기
## 설명 : mysql이 loginId의 고속검색을 위한 부가데이터를 자동으로 관리(생성/수정/삭제) 한다.
## 설명 : 이게 있고 없고가, 특정 상황에서 어마어마한 성능차이를 가져온다.
## 설명 : 생성된 인덱스의 이름은 기본적으로 칼럼명과 같다.
alter table `member`
add unique index(`loginid`);

# 검색속도 확인, loginId 가 'user1' 인 회원 검색
select *
from `member`
where `loginid` = 'user1';

# 인덱스 삭제, `loginId` 이라는 이름의 인덱스 삭제
alter table `member`
drop index `loginid`;

# 회원 테이블 삭제
drop table `member`;

# 회원 테이블을 생성하는데, loginId에 uniqueIndex 까지 걸어주세요.
CREATE TABLE `member` (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    regDate DATETIME NOT NULL,
    loginId CHAR(50) UNIQUE NOT NULL,
    loginPw VARCHAR(100) NOT NULL,
    `name` CHAR(100) NOT NULL
);

# 회원 2명 생성
## 조건 : (loginId = 'user1', loginPw = 'user1', `name` = '홍길동')
## 조건 : (loginId = 'user2', loginPw = 'user2', `name` = '홍길순')
INSERT INTO `member`
SET regDate = NOW(),
loginId = 'user1',
loginPw = 'user1',
`name` = '홍길동';

INSERT INTO `member`
SET regDate = NOW(),
loginId = 'user2',
loginPw = 'user2',
`name` = '홍길순';

# 회원수 확인
select count(*)
from `member`;

# 인덱스 쓰는지 확인
## 힌트 : EXPLAIN SELECT SQL_NO_CACHE * ~
explain select sql_no_cache *
from `member`
where `loginid` = 'user1';

alter table `member`
drop index `loginid`;
alter table `member`
add index(`loginid`);

인덱스가 걸려있을 때와 걸리지 않았을 때의 속도차이가 비교가 안될 정도라는 것을 알 수 있다.


계산기 구현 v1

더하기, 빼기, 곱하기, 괄호 계산까지 됨

package org.example;

public class Evaluator {
    String exp;
    char prevOp;
    long res;
    long prev;
    public Evaluator(String exp) {
        this.exp = exp.replaceAll(" ", "");
        this.prevOp = '+';
        this.res = 0l;
        this.prev = 0;
    }

    public long eval() {
        int i = 0;
        long operand = 0;
        while (i < exp.length()) {
            char letter = exp.charAt(i);
            if (Character.isDigit(letter)) {
                operand *= 10;
                operand += exp.charAt(i)-'0';
            } else if (letter == '(') {
                operand= new Evaluator(exp.substring(i + 1, exp.lastIndexOf(")"))).eval();
                i = exp.lastIndexOf(")");
            } else {
                calculate(operand);
                prevOp = letter;
                operand = 0;
            }
            i++;
        }
        calculate(operand);
        return res;
    }

    private void calculate(long number) {
        switch (prevOp) {
            case '+':
                res += number;
                prev = number;
                break;
            case '-':
                res -= number;
                prev = -number;
                break;
            case '*':
                res = res - prev + prev * number;
                prev *= number;
                break;
            default:
                throw new RuntimeException();
        }
    }
}
profile
백엔드 희망

0개의 댓글