320x100

DB/MYSQL 27

쿼리실행 후 영향받은 쿼리 수 구하기

보통 쿼리를 돌리면 영향받은 로우 수라고 해서 Affected Rows를 구할 필요가 있어진다. MYSQL에서는 실제로 데이터가 변경된 수만 반영되며, 데이터가 변화가 없는 경우엔 0건으로 보여진다. Query SELECT ROW_COUNT(); C API mysql_affected_rows(); 업무 중에서 캐릭터 데이터를 insert 해주고 성공했을 경우(affected row > 0) 나머지 데이터들을 추가로 넣어주려고 했는데 데이터가 추가됐음에도 불구하고 row가 계속 0으로 나왔다. 트랜잭션이나 쿼리가 섞여 있는게 아니였는데도 말이다. https://stackoverflow.com/questions/14437539/how-to-use-row-count-with-transaction how to ..

DB/MYSQL 2021.11.05

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

가끔 어느 테이블을 참고하는 프로시저의 목록을 찾고싶을 때가 있다. 저장 프로시저가 몇개 안될 때야 그냥 하나씩 열어보며 찾으면 되지만 갯수가 점점 늘어날수록 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

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

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

동적 쿼리 작성하기

서버에서 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

인코딩 설정 관련 설정

MYSQL에서 다국어 지원을 위해 인코딩을 UTF로 설정 해야한다. UTF은 글자당 바이트 수에 따라 숫자가 붙는데 UTF-8, UTF-16, UTF-32등으로 나뉜다. UTF-16은 기본 다국어 평면에 해당하는 문자를 16비트(2바이트)로, 그 외는 32비트(4바이트)로 저장하고, UTF-32는 모든 문자를 32비트(4바이트)로 저장한다. 가장 많이 사용하는 UTF-8은 8비트부터 32비트까지 가변적으로 ASCII와 유니코드를 병행해 저장할 수 있어 자주 사용한다. 하지만 MYSQL의 utf8은 과거 UTF-8을 완벽하게 지원하지 않고 3바이트까지로 제한된 방식으로 구현했었다. 대부분의 문자들이 해당 바이트 내에서 표현됐기 때문이라고 생각하는데, 최근들어 4바이트로 표현되는 문자들이 생기면서 기존 ut..

DB/MYSQL 2021.10.11
320x100