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`);
인덱스가 걸려있을 때와 걸리지 않았을 때의 속도차이가 비교가 안될 정도라는 것을 알 수 있다.
더하기, 빼기, 곱하기, 괄호 계산까지 됨
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();
}
}
}