320x100

전체 글 435

모든 저장 프로시저내에서 텍스트 찾기

가끔 어느 테이블을 참고하는 프로시저의 목록을 찾고싶을 때가 있다. 저장 프로시저가 몇개 안될 때야 그냥 하나씩 열어보며 찾으면 되지만 갯수가 점점 늘어날수록 erm? uml?같은 도식도가 없으면 찾기 힘들다. 그럴 때 문자 검색으로 해당 테이블의 이름을 사용하는 프로시저를 검색할 수 있다. (다만 검색할 문자가 흔하고 짧은 경우 정확한 검색이 되지 않을 수 있다) SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_DEFINITION, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%검색할_테이블이름%' AND ROUTINE_TYPE = 'PROCEDURE';

DB/MYSQL 2021.10.25

flatbuffer

flatbuffer는 이기종간의 데이터 교환을 위해 구글에서 만들어진 라이브러리다. 전용 script를 작성하고 전용 compiler를 돌리면 해당 언어에 맞는 ouput을 얻을 수 있다. raw와 비교해서 거의 속도 차이가 없고, 메모리 부분에서도 장점이 있으며 여러 언어에 구애받지 않고 작성할 수 있다는 것이다. protobuf에 비해 3000배 빠른 속도를 가진다고 들었으나 직접 확인한 결과는 아니므로 신뢰하지는 마시라 다운로드는 다음 URL에서 진행하면 된다. https://github.com/google/flatbuffers/releases Releases · google/flatbuffers FlatBuffers: Memory Efficient Serialization Library - goo..

쿼리 조건에 들어갈 내용을 파라미터로 전달하기

C++ 서버에서 MYSQL로 SELECT할 경우 임의로 조건을 컨트롤 하고 싶을 때가 있다. 예를 들자면 서버에서 어떤 때는 1,2,3 어떨 때는 3의 값만 SELECT을 하고 싶은데 하나의 SP로 컨트롤 하고 싶을 때 사용하는 방법이다. b.type 컬럼의 데이터 타입이 정수라고 하자. _type은 텍스트 파라미터로 전달되는데 단순히 WHERE b.type IN 으로 작성하면 에러가 난다. 형와 syntax가 맞지 않기 때문이다. 그래서 FIND_IN_SET이라는 함수를 써서 문제를 해결한다. FIND_IN_SET 함수는 콤마로 구분되어 있는 문자열('a,b,c,d')에 매칭되는 str문자('b')가 있는지 확인해주는 함수다. 매칭되는 것이 있을 경우 몇번째에 있는지 포지션 값을 리턴하고 없으면 0을 ..

DB/MYSQL 2021.10.18

Multibyte ↔ UNICODE ↔ UTF8 변환하기

WideCharToMultiByte 함수 사용을 위해 stringapiset.h 헤더 파일을 lstrlenW 함수 사용을 위해 winbase.h 헤더 파일을 include하고 사용해야 한다. 아래 코드는 예외처리 없이 필요한 코드만 적었으므로 알아서 수정해야 한다. (out 크기가 len보다 작으면 문제) #include #include int Utility::UnicodeToMultibyte(const wchar_t* in, char* out) { if (!in || !out) return 0; int len = WideCharToMultiByte(CP_ACP, 0, in, -1, NULL, 0, NULL, NULL); return WideCharToMultiByte(CP_ACP, 0, in, -1, ..

동적 쿼리 작성하기

서버에서 SP를 호출하며 조건을 임의로 파라미터로 보내주려고 하던 와중에 필요한 것이 동적 쿼리였다. 예를 들면 character 테이블에서 class가 1,2,4인 것을 찾아야 하는 내용을 만들어야 하는데 1,2,4가 고정이 아니라 서버에서 임의로 변경이 가능한 조건이다. 그래서 sp내에 쿼리와 파라미터로 온 조건을 문자열로 합쳐 최종 쿼리를 완성하고 실행 시켜야 하는데 동적쿼리가 필요했다. 내용은 대략 다음과 같다. DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_name` $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_name`( IN `_uid` BIGINT UNSIGNED ,IN `_type` VARCHAR(255) ) BE..

DB/MYSQL 2021.10.15

Replication

Single Master & Single Slave 하나의 Master와 하나의 Slave로 구성된다.Master에 Insert, Update, Delete 같이 데이터가 변경되는 쿼리가 실행되면 binary log에 내용이 저장되고 쿼리가 실행된다.Slave는 그 binary log를 주시하다가 변경점이 생기면 Master에게 변경점에 대해 요청한다.그러면 Master가 binary log에 있는 쿼리를 Slave로 보내고, 응답을 받아 데이터가 전달됨을 보장받는다.Slave는 realy log에 저장되고 적용된다. Single Master & Multi Slave Single & Single과 동일한 방법대로 실행된다. 주로 데이터가 변경되는 Insert, Update, Delete 쿼리는 Maste..

DB/MYSQL 2021.10.14

INSERT와 REPLACE 차이

INSERT는 무조건 테이블에 추가하는 것이고 REPLACE는 기존 테이블에 데이터가 있으면 삭제 하고 추가하는 것이다. REPLACE를 사용하는 경우는 다음과 같다. INSERT로 데이터를 삽입하는 경우 기존 테이블의 데이터와 충돌하면 뒤의 작업들은 실패 처리 된다. 그러므로 SELECT를 하고 나서 충돌나지 않게 작업해줘야 하는데 REPLACE는 한번의 쿼리로 작동이 가능하다. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=reinstate10&logNo=220071702943 MySQL에서 INSERT 와 REPLACE 의 차이 MySQL에서 사용하는 INSERT 구문과 REPLACE 구문의 용도와 차이점을 정리한다. INS..

DB/MYSQL 2021.10.13

실행 계획 보기

쿼리 또는 저장프로시저의 실행 흐름을 보고 구체적인 예상 소요 시간 파악을 통해 병목점을 수정하고 싶을 땐 실행 계획을 통해 어디서 얼마나 걸리는지 확인할 수 있다. 1. 쿼리의 실행 계획 보기 EXPLAIN SELECT * FROM table_name; 2. 저장 프로시저의 실행 계획 보기 SET profiling = 1; CALL sp_name(); SHOW PROFILES; 3. 원형 {EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild] {EXPLAIN | DESCRIBE | DESC} [explain_type] {explainable_stmt | FOR CONNECTION connection_id} explain_type: { EXTENDED | PAR..

DB/MYSQL 2021.10.12
320x100