반응형

쿼리

    mysql 컬럼별 상위 N건 조회하는 방법

    mysql을 사용하고 있는 상황에서 타입별 보유하고 있는 score별 순위 2개까지의 값을 가져오는 쿼리가 필요했다. 예를 들면 강아지 페스티벌에 참여한 강아지들의 스코어 별 상위 3위까지의 강아지를 찾는 쿼리가 필요했다. 그럼 값을 한번 추출해보자. 우선 전제가 되는 테이블은 아래와 같다. # database 생성 create database test character set utf8mb4 collate utf8mb4_general_ci; use test; # 테이블 생성 create table dog_festival ( id int primary key not null auto_increment, dog_type varchar(30), score int ) # 값 추가 insert into dog_f..

    elasticsearch percolating 쿼리

    엘라스틱 서치에서 일반적인 검색 기능은 특정 인덱스에 문서를 저장하고, 쿼리에 매칭되는 문서를 불러오는 방식으로 수행된다. 하지만 percolating 쿼리 방식은 그 반대로 동작한다. 쿼리를 사전에 저장하고, 새로 유입된 문서가 매칭되는 쿼리가 있는지 확인해 매칭되는 쿼리를 반환한다. 업무적으로 필요한 기능이어서 알아보던 중 알게되어서 정리해본다. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html 인덱스 생성아래 인덱스생성에 보면 두 가지 필드를 볼 수있다. 먼저 message 필드는 percolator에서 정의된 문서를 임시 인덱스로 인덱싱하기 전에 사전 처리하는 데 사용되는 필드이..

    Elasticsearch 질의 DSL 정리

    엘라스틱 서치를 공부하면서 봤던 DSL 쿼리를 정리해보자. Query와 Filter의 차이Query는 일반적으로 Full Text Search(전문검색)에 사용되고 필터는 YES/NO 조건의 바이너리 구분에 주로 사용된다. 쿼리는 scoring이 계산되나 필터는 계산되지 않는다. 쿼리 결과는 캐싱되지 않고 필터 결과는 캐싱된다. 상대적으로 쿼리는 응답속도가 느리고 필터는 응답속도가 빠르다. term - term은 색인이 나눠지면서 형태소로 나누어지는 저장되는 토큰등을 term이라고 한다. term 쿼리는 주어진 질의문과 저장된 텀과 정확히 일치하는 문장을 찾는다. - term으로 "name" : "cjung gglee" 라고 입력하게 되는경우에는 "cjung gglee"라는 하나의 term을 찾기 때문에..

    인덱스 생성 및 데이터 삽입

    Elasticsearch에서 인덱스를 만들고 타입을 지정하여 데이터를 삽입하는 과정을 정리해보자. elasticsearch는 Restful API가 지원되기 때문에 BSL 쿼리를 이용하여 쉽게 데이터를 조작할 수 있다. 인덱스 생성Methd : put URLI : /{indexname}?pretty 생성된 인덱스 확인 Method : GET URI : _cat/indices?v kibana dev-tool에서 customer 인덱스가 생성된 것을 확인할 수 있다. 타입, Document 생성 및 데이터 추가 Method : PUT URI : /{indexname}/{typename}/[documentid]?pretty 만약 documentid를 넣지 않으면 랜덤으로 만들어서 삽입된다. 입력된 데이터 확인..

    Spring boot hibernate jpa에서 Auditing 사용 - update, create 시간 자동 변경

    엔티티를 만들고 데이터를 삽입하고 조작할 때 create date와 last modified date를 별도로 업데이트 해주면서 관리하였다. 하지만 이번에 JPA를 공부하면서 별도의 작업 없이 JPA의 Auditing 기능을 사용하면 데이터를 삽입하고 수정할 때 자동으로 날짜를 수정하도록 할 수 있는 기능이 있는 것을 확인했다. 1. ConfigurationJPA Auditing을 사용하기 위해서는 기능을 자동으로 활성화 해주는 어노테이션을 붙혀주면 된다. 처음에는 @Configuration을 사용하는 클래스에 함께 선언해주었는데 정상적으로 적용이 되지 않아서 @SpringBootApplication을 사용하는 곳에 적용했더니 성공적으로 적용되었다. 123456789101112131415161718192..

    Mysql 묵시적 형변환

    묵시적 형변환 조건절의 데이터 타입이 다를 때 우선순위가 높은 타입으로 형이 내부적으로 변환 되는 것. 정수 > 문자열 순이며 만약 정수와 문자열이 비교가 되는 경우에는 둘중에 우선순위가 낮은 것이 변경된다. 우리는 이렇게 자동으로 형변환 해주는 경우에 익숙해져 있다. 자바에서도 Integer와 int 두 개의 변수의 값을 묵시적으로 형변환 시켜주지만 이는 이펙티브 자바 책에서도 볼 수 있지만 성능저하의 원인이 된다고 한다. Mysql도 예외가 아닌 것 같다. 예를 들어 보자 아래와 같은 테이블을 생성 후 데이터를 삽입한다. 1234567891011121314151617181920212223# 테이블 생성 create table chagne_data ( id int unsigned not null aut..

    Mysql 실행계획 설명

    프로그램의 성능을 높히기 위해서는 DB튜닝이 필요하다. Mysql에서 튜닝을 하기 위해서 제공하는 쿼리의 실행 계획에 대해 정리해보자. Mysql의 데이터 처리 방식우선 Mysql의 데이터 처리방식에 대해 정리해보자. - Mysql은 단일 코어로 데이터를 처리하기 때문에 멀티코어로 scale out을 진행하는 것 보다 cpu 자체의 성능을 높히는 scale up을 하는 것이 더 효율적이다. - Oracle과 달리 mysql은 nested loop join 알고리즘만 사용한다. - Nested Loop Join은 선행 테이블의 검색 결과 값 하나하나 테이블 B와 조인하는 방식이다. 그래서 데이터 양이 적을 때는 상관이 없으나 데이터가 많은 테이블끼리 조인할 시 성능에 문제가 있을 수 있다. 그래서 내부적으..

    바인드 변수를 이용한 오라클 SQL 튜닝 소개

    저번 시간에 내부 프로시저를 재사용해야 쿼리 수행시 비용이 감소한다고 공부하였다. 그렇게 재사용성을 높이기 위해서 어떻게 해야하는지 알아보자. 바인드 변수 사용 사용자 정의 함수/프로시저, 트리거등은 별도의 이름이 있어 생성하여 계속해서 재사용할 수있다. 하지만 SQL은 이름이 없어서 내부 프로시저에 저장하여 사용한다. 그렇듯 SQL은 별도의 이름이 아닌 그 자체가 이름처럼 고유의 값으로 사용된다. 그럼 공백이나 대,소문자가 달라도 다른 객체인가? 아래 쿼리를보자. 12345678select * from t where empno = 7695;select * from t where empno = 7695 ; select * from T where empno = 7695;select * from t WHER..

    SQL 최적화 과정과 옵티마이저 소개 및 역할안내

    SQL 최적화 과정 오라클을 기준으로 SQL의 최적화 과정은 다음과 같다. 1. SQL 파싱-> 파싱트리 생성-> 문법적 오류 확인-> 의미상 오류 확인 (없는 컬럼, 테이블 접근)2. SQL 최적화-> 옵티마이저가 미리 수집한 시스템 및 오브젝트 통계정보를 바탕으로 가장 최적의 실행경로로 선정 3. 로우 소스 생성-> 선정된 실행경로를 실제 실행 가능 코드로 변경 (Row-Source Generator)가 역할 수행 그럼 이런 최적화를 진행하는 옵티마이저는 어떤것이고 또 어떻게 진행이되는가? SQL 옵티마이저란?- 옵티마이저는 사용자의 작업을 가장 효율적으로 수행할 수 있는 최적의 데이터 액세스 경로를 선택해주는 DBMS 엔진을 말한다. 최적화 단계 - 쿼리를 수행할 실행계획 찾기- Data Dicti..

    Mybatis에서 쿼리 작성 시 부등호 사용하면 발생하는 Error 수정

    Mybatis에서 사용하는 쿼리중에 와 같은 부등호가 들어가게 되면 에러가 발생한다. [에러내용]"The content of elements must consist of well-formed character data or markup." 이를 해결하기 위해서는 부등호를 사용하는 쿼리는 을 감싸주어야 한다. 12345678910

반응형