목록mysql (12)
hmk run dev
데이터 조회 시 JOIN이 들어가는 쿼리일 경우엔 특정 레코드엔 NULL인 칼럼이 들어가는 경우가 빈번하다. 이럴 때 특정 레코드의 칼럼이 NULL인 경우 WHERE 조건을 사용하지 않고 싶을 때 아래처럼 구현하면 된다. SELECT * FROM w_schedule ws LEFT OUTER JOIN w_work w WHERE 1=1 AND ((w.wait_yn IS NULL and 1=1 ) or (w.work_stat IS NOT NULL and w.wait_yn = 'N')) 위의 코드처럼 w_work가 조인돼서 생기는 필드인 w.wait이 IS NOT NULL인 경우에 한해 w.wait_yn = 'N' 조건을 걸어준다. FROM w_alliance_work waw LEFT OUTER JOIN w_w..
DB에 접근하는 서비스 처리요청 1. 매번 요청마다 connection이 필요하다. 2. 매번 요청마다 connection을 생성한다. - 전체 50% 이상의 공수 3. connection을 통해 요청을 처리한다. 4. connection을 닫는다. 매번 요청마다 connection을 생성하면 어플리케이션이 느려지거나 서버가 죽을 수 있다! 커넥션 풀 생성 시 고려할 사항 1. 너무 작다면 대기하는 요청이 많아진다. 2. 너무 크면 메모리 낭비가 심해진다. 3. 접속자 수, 서버 부하 등을 고려해 적절한 크기로 조정필요 Dao를 통해 예를 들어보자 1. 한개의 커넥션을 사용할 경우 MemberDao => connection MemberDao는 할당된 커넥션 객체를 이용해 DB에 접근 그러나 여러개의 Da..
인덱스란? 검색을 위해 임의의 규칙대로 부여된, 임의의 대상을 가리키는 무언가( ex 주소, 주민등록번호 등등...) 데이터베이스의 인덱스 인덱스에는 크게 두 가지 인덱스가 있다. Cluster(군집) 데이터와 인덱스가 군집, 밀접하게 관련있음 예시 데이터 구조 1 => 김형민, 28 2 => 홍길동, 24 3 => 임꺽정, 26 이런 데이터 구조사이(1과 2의 사이 )에 새로운 데이터가 들어온다고 가정을 해보자 2. 이순신, 33 >> 1 => 김형민, 28 2 => 이순신, 33 3 => 홍길동, 24 4 => 임꺽정, 26 위를 통해서 cluster 인덱스의 장점과 단점을 얉게 훑어 볼 수 있다. 특징 순서대로 한 테이블당 1개 범위 검색 성능 좋음 존재하는 PK사이에 INSERT시 성능 저하( 데..
백업하고자 하는 데이터 베이스 우클릭 > 도구 > Dump database 테이블 선택가능 백업 완료가 되면 파일이 생성된다. 더블클릭으로 파일을 열어보면 DB복구를 위한 쿼리문이 있다. 그냥 실행시키는 건 조금 야만? 적인 방법 같으니 복구하고자 하는 DB우클릭 > 도구 > Restore Database > Input File에 백업된 파일 업로드 Start 버튼 클릭! 복구완료~!
어떻게 좋은 쿼리를 짜 효율적으로 DB에서 데이터를 가지고 올 수 있을까?라는 질문에 80%가 넘는 답변은 "실행계획 떠봐" 였다. 상당히 중요한 부분이란 걸 알고 있었지만 어렴풋이 알고 넘어갔었기에 이렇게 포스팅을 남겨 제대로 정리해 본다 :) 조회는 이렇게 실행할 쿼리 앞에 EXPLAIN을 쓰거나 마우스 우클릭 > 실행 > 실행계획 보기 (DBeaver의 경우)로 조회가 가능하다. explain select * from w_work; 아래와 같은 결과를 볼 수 있는데 실행계획에서 각 칼럼이 의미하는 것을 정리해보겠다. id 컬럼 더보기 SELECT쿼리를 구분하기 위한 용도로 쓰인다. ( 몇 개의 SELECT가 실행되었는지 확인할 수 있다. ) - SELECT 쿼리에 join 등을 통해 여러 개의 테이..
PL/SQL 함수를 이용해 부모 row에 대한 정보를 가져오는 쿼리 대신 함수 없이 조회할 수 있는 방법으로 데이터를 조회 해봤다..! PL/SQL이 좀 더 빠르긴 하지만 이번에 MYSQL 버전 업그레이드 이후로 함수생성 권한을 받는 것도 까다로워 졌고 PL/SQL 문법도 이전 버전과 맞지 않는 부분이 조금있는 것 같아서 시도해본 방법이다...;; 사실 특별한 방법 이랄게 있나 싶다. PL/SQL로 하던 작업을 여러번의 inner join(부모 row에 대한 정보가 확실할때만)을 이용해 가장 상위부모 row의 데이터를 가지고 오면 된다. 더 효율적인 방법이 있을 것 같은 냄새가 솔솔나는 쿼리다... 일단 적용해놓고 추후에 리팩토링 하기로 했다..! left join ( select // 개편 후 카테고리..
다이나믹하게 쿼리를 짜보고 싶어서 XML 파일이아닌 인터페이스에 변수로 쿼리를 등록해놓고 사용해보고 싶었다. 우선 context-application.xml 에 spring bean으로 등록 해야 스프링에서 빈 주입을 해준다! // mapper 인터페이스를 만든 경로 interface등록 @Mapper public interface BizMsgMapper { String QueryStr = "SELECT table_name\r\n" + "FROM information_schema.tables \r\n" + "WHERE table_type = 'BASE TABLE'\r\n" + "AND table_schema='workerman_dev2' and table_name like '%BIZ_LOG%'"; @Se..
FUNCTION - 자신을 호출한 곳으로 반드시 하나의 값을 리턴해 줘야되는 PL/SQL Stored Program이다. - Stored Function or User Function or User-Defined Function 이라고 한다. - 자신의 스키마 계정에 함수를 작정하려면 CREATE PROCEDURE 시스템 권한 필요 - Header에 리턴되는 데이터 타입을 기입 Header 끝에는 IS[AS]가 와야하고 IS[AS]와 Begin사이에 Begin~End에서 사용할 변수를 선언한다. 기본 형식 ex) CREATE [OR REPLACE] FUNCTION function_name[parameter] RETURN 리턴 데이터타입 IS[/AS] Declaration_section // BEGIN 과..
char사용을 지양하고 varchar를 이용하라는 이야기를 들었다. 고정길이로 설정해도 괜찮을 것 까지 모두 varchar로 설정하라는데 의구심이 들어 char와 varchar의 차이점에 대해 좀 더 심도 있게 알아보고자 한다. CHAR 고정길이 문자열 타입으로 만약 타입의 크기만큼의 데이터가 들어오지 않은경우 이후의 공간을 스페이스로 채워넣습니다. 고정길이 문자열이기 때문에 헤더에는 레코드의 길이에 대한 정보가 들어있지 않습니다. . VARCHAR 가변길이 문자열 타입으로 타입의 크기만큼의 데이터가 들어오지 않더라도 이후의 공간을 스페이스로 채워넣지 않습니다. 가변길이 문자열이기 때문에 헤더에는 레코드의 길이에 대한 정보가 포함되어야 합니다. CHAR(5) & VARCHAR(5) 데이터가 들어오는 경우..
데이터베이스를 구축하다보면 텍스트 데이터(Text Data)를 취급해야 할 때가 있다. 이때 반드시 고민해야 하는 것이 있는데, 바로 문자셋(character set)을 선택하는 것이다. 실생활의 대부분의 데이터는 텍스트기반(text-centric)이다. 당연히 실생활의 모든 텍스트 데이터를 저장할 수 있는 자료형이 필요로 하게 되었다. 이것을 위해서 나온 charset이 UTF-8 이다. UTF-8 문자 집합은 1~4 바이트까지 저장이 가능하게 설계되었다. (알파벳 1byte, 한글 3byte) MySQL/MariaDB 에서도 UTF-8 을 지원한다. 이때! 간과한 사실이 있는데, 전세계 모든 언어가 21bit (3바이트가 조금 안됨)에 저장되기 때문에 MYSQL 에서 utf8 을 3바이트 가변 자료형..