개발 공부 기록하기/02. DB & SQL 24

R2DBC pooling yml로 설정하기

의존성 implementation("io.asyncer:r2dbc-mysql:1.0.2") // R2DBC MySQL Driver implementation("io.r2dbc:r2dbc-h2:1.0.0.RELEASE") 꽤 tricky 하게 yml로 설정한 auto configuration을 이용할 수 있음. url 부분에 "pool"이 들어가지 않는 것이 핵심! r2dbc pooling 공식문서에서 얘기하는 "r2dbc:pool:mysql"을 사용하는 방법은 Configuration을 (yml을 사용하지 않고) 직접 해줄 때 사용하는 방법이다. spring: r2dbc: url: 'r2dbc:mysql://localhost:3306/database?option1=value1' username: 'roo..

내맘대로 정리하는 Real MySQL #16 #17장) 베스트 프랙티스와 응급처치

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 16장. 베스트 프랙틱스 임의 정렬 기준을 아무것도 적용하지 않은 임의의 순서대로 가져오는 방법 SELECT * FROM tb_member ORDER BY RAND() LIMIT 1; record 건수나 WHERE로 걸러진 record 건수가 많다면 문제될 수 있다. 인덱스를 사용한 임의 정렬 임의의 정수 필드를 테이블에 항상 랜덤하게 추가 저장한다. 이 column에 index를 걸어 램던 조회시 random 값을 하나 골라 그 보다 큰 것 3개, 작은 것 3개를 가져와 union을 건다 페이징 인덱스를 사용한다 하더라도 계속해서 다..

내맘대로 정리하는 Real MySQL #14 #15장) 데이터 모델링과 데이터 타입

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 14장 데이터를 모델링할 때 각 개체가 어디서부터 어디까지를 포함할 것인지를 명확히 하는 것은 매우 중요하다. Attribute는 반드시 독자적인 성질을 가지는 하나의 값만을 저장해야 한다 식별 관계 : 부모의 식별자가 자식 엔티티의 레코드를 식별하는데 꼭 필요하다면 그 관계는 식별 관계다. 비식별 관계 : 부모 엔티티의 식별자가 없어도 자식 엔티티의 레코드가 생성될 수 있을 때 비식별 관계를 사용한다. 순환관계를 계층형관계로 고친다고 해서 나아지는 것은 아무것도 없다. 15장 칼럼의 데이터 타입과 길이를 선정할 때 가장 주의해야 할 ..

내맘대로 정리하는 Real MySQL #13.1장) 프로그램 연동 (JDBC)

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 실제로 현장에서 가장 취약한 부분은 애플리케이션과 데이터베이스를 연결하는 인터페이스 부분이다. JDBC와 같은 인터페이스 부분은 애플리케이션과 MySQL 데이터베이스의 중간에 위치하고 있어서 양쪽의 특성을 잘 알지 못하면 최적의 옵션을 선택하기가 쉽지 않다. Connector/J MySQL의 JDBC 이름 JDBC URL MySQL 서버의 정보를 표준 포맷으로 조합한 문자열. 때로는 connection string이라고도 한다 jdbc:mysql:// 은 고정된 값으로 MySQL 서버에 접속하기 위한 JDBC URL 임을 알려주는 프로..

내맘대로 정리하는 Real MySQL #12장) 쿼리 종류별 잠금

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 이번 장에서는 대표적인 SQL 문장별로 어떤 잠금이 사용되고 이러한 잠금을 어떻게 우회할 수 있는지도 함께 살펴보겠다. 대부분의 잠금 관련 내용은 InnoDB 스토리지 엔진을 사용하는 테이블에 대한 내용이다. InnoDB의 기본 잠금 방식 InnoDB에서는 각 쿼리의 패턴별로 사용하는 잠금이 다르다. InnoDB 테이블에서 기본적인 SQL 문장이 어떤 잠금을 필요로 하는지 살펴보자. SELECT SERIALIZABLE 격리 수준에서는 모든 SELECT 쿼리에 자동적으로 LOCK IN SHARE MODE가 덧붙여져서 실행되는 효과를 내기..

내맘대로 정리하는 Real MySQL #9장) 사용자 정의 변수

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? MySQL 서버가 정의한 변수가 아니라 사용자가 정의하는 변수를 의미한다. 사용자 변수는 해당 커넥션에서만 유효하기 때문에 항상 세션 변수로 취급된다. 또한 사용자가 언제든지 값을 변경할 수 있기 때문에 동적 변수로 볼 수 있다. 사용자 변수 개요 MySQL의 사용자 변수 이름은 @로 시작한다. 사용자 변수는 저장하는 값에 의해서 그 타입이 정해진다. 저장할 수 있는 타입은 Integer, Decimal, Float, Binary와 문자열 타입만 가능하다. 초기 값을 설정하지 않으면 NULL이 된다. 값을 할당하는 SET 문장은 = 또..

내맘대로 정리하는 Real MySQL #7장) 쿼리 작성 및 최적화

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 이번 장에서는 쿼리의 각 패턴별로 "어떻게 처리되는가?"를 살펴보겠다. 또한 많이 알려져 있지 않지만 프로그램 코드를 상당히 줄일 수 있는 유용한 쿼리 패턴도 함께 살펴보겠다. 내맘대로 정리하고 싶었으나, 페이지 수가 무려 180p인 크고 아름다운 Chapter라서 필요하다면 세부 주제별로 잘개 쪼개 정리해보았다. (앗 생각해보니 어차피 내맘대로구나..!) 쿼리와 연관된 시스템 설정 lannstark.tistory.com/38 MySQL sql_mode 설정과 옵션 sql_mode 옵션은 SQL의 작성과 결과에 영향을 미치는 옵션이다...

MySQL DDL 총 모음

업무를 진행하면서 간혹 DDL을 써야 할 때가 있는데, 그때마다 구글 검색을 하는 것이 여간 번거로운 일이 아니다. 때문에 아싸리 총 정리를 해서 여기만 보려고 한다. 혹시 저처럼 구글 검색이 귀찮으신 분이 계시다면 이 페이지 즐겨찾기 추천드립니다 ^^,, 빠진 DDL이 있다면 댓글로 알려주세요! 추가하겠습니다 :) DB의 구조 및 정의를 생성하거나 변경하는 쿼리를 DDL이라 한다. 데이터 베이스 DB 생성 CREATE DATABASE [IF NOT EXISTS] employees; CREATE DATABASE [IF NOT EXISTS] employees CHARACTER SET utf8; CREATE DATABASE [IF NOT EXISTS] employees CHARACTER SET utf8 CO..

MySQL 교집합과 차집합

MySQL에서는 INTERSECT와 MINUS 연산을 지원하지 않는다. 어떻게 하면 다른 쿼리를 같은 효과를 낼 수 있는지 알아보자..! INTERSECT SELECT emp_no FROM dept_emp WHERE dept_no = 'd001' INTERSECT SELECT emp_no FROM dept_emp WHERE dept_no = 'd002'; INNER JOIN을 사용할 수 있다. SELECT de1.emp_no FROM dept_emp de1 INNER JOIN dept_emp de2 ON de2.emp_no = de1.emp_no AND de2.dept_no = 'd001' WHERE de1.dept_no = 'd002'; MINU..

서브쿼리 튜닝

서브쿼리 전반 서브쿼리의 종류 서브쿼리는 두 가지 종류가 있다. 상관서브쿼리 : 서브 쿼리가 독립적으로 실행되지 못하고 외부 쿼리 결과를 기다려야 하는 경우 독립서브쿼리 : 서브 쿼리가 독립적으로 실행될 수 있는 경우.. 하지만 MySQL에서는 독립 서브쿼리라 하더라도 효율적으로 처리되지 못할 때가 많다. 서브쿼리의 제약 사항 서브 쿼리를 IN 연산자와 함께 사용할 때에는 효율적으로 처리되지 못한다. IN 연산자 안에서 사용되는 서브 쿼리에는 ORDER BY와 LIMIT을 동시에 사용할 수 없다. 서브쿼리가 사용되는 곳 SELECT 절에 사용된 서브쿼리 SELECT 절에 사용된 서브쿼리는 내부적으로 임시 테이블을 만든다거나 쿼리를 비효율적으로 실행하도록 만들지는 않기 때문에 서브 쿼리가 적절한 인덱스를 ..