duplicate
- duplicate는 조심해야한다 만약 INSERT를 할 때 실패를 했고 on duplicate key update dname ='서버팀2'를 한다면 row를 두번타게된다..
INSERT INTO Dept (PID, dname ) VALUES (2, '서버팀')
ON duplicate key update dname ='서버팀2'
- 위대로 한다면, 중복값으로 값이 못들어가서 실패 그후에 dname을 서버팀2로 들어가게된다 이럴때 pk값이 1개를 건너 뛰게된다.
transaction, savepoint
- select @@autocommit 에서 autocommit이 1이라면 true이다..
start transaction;
select * from Dept where id in(1,2);
SAVEPOINT SA1;
update Dept set dname='영업부서' where id = 1;
commit;
rollback TO SAVEPOINT SA1;
- start transaction을 하게된다면 auto commit이 잠시동안 false로 된다..
데이터 모델링 간단 정리.
테이블에 데이터가 너무 많아서 group by를 할 때 시간이 걸리게 된다면 group by할 컬럼을 미리 만들어 놓는 것도 성능향상에 있다, group by하는 것도 시간이 걸리기 때문이다.
pk가 가장 중요하다, 유일 값을 갖는 기본키가 필수이다, 변경이 된다면 큰일,,, 제가 테이블 characterItem 테이블을 만들었던 적이 있습니다. 그때 스미가
CREATE DATABASE IF NOT EXISTS RedDB;
USE RedDB;
DROP TABLE IF EXISTS RedDB.`CharacterItem`;
CREATE TABLE IF NOT EXISTS RedDB.`CharacterItem`
(
CharacterItemId BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '고유 번호',
CharacterId BIGINT NOT NULL COMMENT '소지한 캐릭터 번호',
Code INT NOT NULL COMMENT '마스터 아이템 데이터의 Code 값',
Status INT DEFAULT 0 NOT NULL COMMENT '상태 (ex : 파괴, 장착)',
CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '생성 날짜'
) COMMENT '캐릭터 보유 아이템';
- 라고 존재했었는데, 여기서 저는 characterId로 아이템 테이블에 접근을 했습니다. 그런데 캐릭터아이템ID를 주키로 잡아버리면 모든 ROW들을 다 검사를 해야한다. 내가 찾는 것은 캐릭터ID라서... 그래서 해결 방법은 주키를 캐릭터ID로 했거나 아이템ID랑 캐릭터ID를 조합해서 주키로 사용을 했어야했다... 조심. ..
컬럼은 비싸다..
- 데이터를 정의할 때 컬럼은 비싸다 그래서 ROW로 변경을 할 수 있다면 변경하는 것이 이득..
적절한 정규활를 하자.
정규화의 목표는 중복데이터를 지우는 것이다. 또한 NULLABLE 할 필요가 없다면 NOT NULL를 넣어두자..
테이블에서 예를 들어서 물건 테이블과 임차인 테이블이 존재햇을 때 임차인이 사라졌으면 물건 테이블에서도 해당 임차인에 대한 정보를 삭제해줘야한다. 외래키를 걸어 CASCADE DELETE를 하면 연관된 것이 지워지지만 관계를 걸지 않으면 참조 무결성이 깨져버린다..
'MYSQL' 카테고리의 다른 글
MYSQL VERSION 확인 (0) | 2023.10.05 |
---|---|
partition / index 타기 (정리 예정) (0) | 2022.09.18 |
InnoDB VS MyISAM, 인덱스 최적화, 쿼리 최적화 (0) | 2022.09.17 |