Database 34

TypeScript TypeORM Migration 정리

TypeORM 사용중 migration 기능을 대충 본것 같아 관련한 기능을 정리해봤다. 모델 변경사항을 데이터 베이스에 동기화해야한다. 일반적으로 데이터베이스에서 데이터를 가져오면 프로덕션에서 스키마를 동기화할 때 사용하는 synchronize: true 는 안전하지 않다. 마이그레이션은 데이터베이스 스키마를 업데이트하고 기존 데이터베이스에 새로운 변경사항을 적용하기 위해 SQL 쿼리가 포함된 단일 파일이다. import { Entity, Column, PrimaryGeneratedColum } from "typeorm" @Entity() export class Post { @PrimaryGeneratedColum() id: number; @Column() title: string; @Column() ..

[삽잡이::DB] Query Analyzer

EXPLAIN을 사용하여 explain plan 즉, 내가 작성한 Query문이 어떤식으로 진행될 것인지 실행 계획에 대해 확인할 수 있습니다. ... SUN에 인수된 MySQL에서는 EXPLAIN과는 같으나 시각적으로 좀 더 보기 편한 기능을 제공해줍니다.바로, MySQL Monitor인 Query Analyzer 입니다. [출처_ MySQL]EXPLAIN 만으로도 쿼리 분석은 가능하지만,비쥬얼하게 쿼리 분석을 할 수 있다는 것입니다.우와아~~

[삽잡이::DB] Index를 타라~

인덱스는 '색인'을 뜻합니다. (출처_ 네이버 백과사전) DB에서는 수 없이 많은 데이터속에서 빠르게 검색하기 위해 '인덱스'를 사용하게 됩니다.인덱스란, 원하는 데이터를 쉽게 찾을 수 있게 도와주는 녀석이라는 것입니다.제 주변에서는 흔히들 '인덱스를 타다'라고들 하더군요.. 오빠 차 뽑았다~ 널 데리러 가~ 아무튼, 우리가 만들어놓은 DB 테이블을 기반으로 인덱스를 생성할 수 있습니다. 모든 DBMS는 B*Tree 인덱스를 기본적으로 제공한다고 합니다.(출처_ dbguide.net) 나무를 뿌리부터 거꾸로 세워둔 형태의 구조입니다.어지럽겠다~~ 가지역할을 수행하는 Branch Block은 나무와 같이 분기를 목적으로 사용되고,가지에 달려있는 잎사귀와 같은 Leaf Block을 가리키는 포인터를 가지고 ..

[삽잡이::sql] 두 종류의 COUNT를 한번에 얻어보자! 특정 조건 Count

Query문을 작성하며 원하는 결과가 포함된 데이터의 개수를 구하기 위해COUNT()를 사용하곤 합니다. 그런데, 예를 들어봅시다. 이와 같은 Table이 있는데,해당 Table의 전체 개수와 Age가 10대인 데이터의 개수만을 구하기 위해서는어떻게 해야할까요?? 물론, 쿼리를 두번 날릴 수 있지만,성능을 위해 한번에 처리하는 것이 좋을 것입니다.(물론, 저정도 양이라면... 이런 고민 조차가...) 1SELECT COUNT(*), COUNT(IF(age > 20, age, NULL)) FROM info_table;cs 이와 같이 전체 데이터의 개수와,IF문을 사용하여 age가 10대인 데이터의 개수를한 Query에서 동시에 구할 수 있습니다. 예... 그렇습니다.굳~

[삽잡이::sql]mysql 테이블을 가지고 놀자! ALTER TABLE

기존에 존재하는 테이블에깜빡하고 하나의 컬럼을 빼먹은 적이 있습니다. 어떻게해야할까요? 다시 만들어야될까요?그러기에는 기존에 존재하는 데이터들이 너무 아까웠습니다. 물론, 다른 방법들도 존재하지만,컬럼을 추가하고 앞으로 들어오는 데이터에는추가된 컬럼의 값도 저장하기로 결정하였습니다. 좋아좋아~ 추가를 해보자~ '변하다', '바꾸다' 등의 실제 의미를 가지고 있는 ALTER 명령어는말 그대로 DB의 구조를 변경하는데 도움을 주는 녀석입니다. 그 중에서 우리는 Table에 Column을 추가하는 것이니ALTER TABLE 명령어를 사용하면 되겠지요. 1ALTER TABLE shovelman_info ADD COLUMN nickname varchar(25) NOT NULL;cs 이처럼 간단하게ALTER TAB..

[삽잡이::sql] CASE WHEN THEN WHEN THEN ELSE END !?

case 하시면 뭐가 떠오르시나요? 삽잡이는switch ~ case 문이 떠오르군요.... 예 그렇습니다.... 저는 컴공 출신 풋내기입니다... SQL에서도 case 문이 있습니다.뭐, 사실 if문도 있는 것 보면 그다지 이제 놀랄일도 없지요. 아무튼...개인적으로는 조건이 많이 들어가는 Query문은 성능상 좋지 않을 경우들이 많다고 생각하기에 조심스럽게 사용해야한다 생각하지만... 뭐 모두 case by case니깐요~ 그러면 한번 알아봅시다~ MySQL Reference Manual에는 이렇게 나와있습니다. (출처_ MySQL Reference Manual) 뭐,,, 그런데 하나 이상의 프로그래밍 언어를 다뤄보신 경험이 있다면 그렇게 어렵지 않게 느껴지실 것입니다. CASE 문을 통해 Query에..

[삽잡이::sql]count() 와 IF() 사용 주의사항! 이라 쓰고 삽질이라 읽는다

1SELECT IF(name = '삽잡이', 'Yes', 'No') AS result FROM people_finder;cs 이와 같은 Query문을 통해 각 레코드에 있는 컬럼(name)의 값이삽잡이일 경우 Yes를 그리고 아닐 경우 No를 나타낼 수 있습니다. 해당 Query문의 결과는 아마 이와 같이 출력될 것입니다. 역시 삽잡이는 유일무이하군요... 그런데 말입니다...만약, 삽잡이가 있는 레코드를 제외한 나머지 레코드들의 수를 계산해야할 필요성이 생겼습니다. 1SELECT IF(name = '삽잡이', COUNT(*), COUNT(*)-1) AS result FROM people_finder;cs 이와 같이 Query문을 작성했지요... 그런데... 삽잡이는 분명 있는데 말입니다.계속 거짓으로 ..

[삽잡이::sql] 쿼리문에서도 조건을 걸 수 있다! IF

if란...예 그렇습니다. 만약에... 만약에 말야~ 우리~ 센치해지는 순간이군요....아무튼... 그런게 아니라... Query문에서도 조건을 걸 수 있습니다. 1SELECT IF(name = '삽잡이', 'True', 'False') FROM people_finder;cs 이런식으로 말입니다! 간단하지유~? Query문도 조건을 걸면서 날릴 수 있다니~~ 그래도 날리기전에 EXPLAIN 때려보고Index 타는지 꼭 확인해보세요~ 굳~

[삽잡이::sql] 중복을 제거하라! DISTINCT

삽잡이는 중복된 데이터를 지우고 컬럼에 원하는 값들이 존재한지 알아볼 필요성이 생겼었습니다. 아래와 같은 Table에 blood_type이라는 컬럼이 있다고 가정해보겠습니다. 삽잡이는 A, B, AB, O 혈액형 모두가 해당 Table에 있는지 확인하고 싶어합니다. 오오~~ 알려줘~ 알려줘~ 이럴땐 어떻게 해야할까요??? 바로! DISTINCT 라는 키워드를 사용할 수 있습니다. 뚜렷한이라는 뜻을 가지고 있습니다. 네~ 그렇습니다. DISTINCT 키워드를 통해SELECT 문의 결과에서중복을 제거한 데이터를 뽑아낼 수 있습니다. 1SELECT DISTINCT blood_type FROM personal_records;cs 비록 간단한 예시지만,이와 같이 DISTINCT 키워드를 사용하여 중복되지 않은 결..

[삽잡이::sql] 테이블을 복사 그리고, Index의 중요성

똑같은 데이터를 가지고 테스트할 일이 있어서테이블을 복사하고자 시도했었습니다. (그냥 dump로 복사할껄...) 1CREATE TABLE NEW_테이블명 AS SELECT * FROM OLD_테이블명cs select 문 안에 들어있는 테이블의 데이터를 복사하여새로운 테이블에 붙여넣을 수 있습니다. 참고로 구조만 복사할 경우에는 LIKE 를 사용하시면 됩니다.이렇게요~! 1CREATE TABLE NEW_테이블명 LIKE OLD_테이블명cs 간단하지 않습니까? 뭐야 쉽네~ 별거 없네~ 그런데 이렇게 복사한 테이블을 사용하여테스트를 진행했을 때에는엄청난 혼란만 키웠을 뿐입니다. 예... 쿼리가... 너무 오랫동안 실행하고 있어서....찾아봤더니!!!! 기존에 Index를 탔었는데,이 복사한 Table에서는 I..