쿼리 앞에 EXPLAIN 키워드를 붙이면 실행 계획을 확인 할 수 있다. EXPLAIN SELECT * FROM test; 실행 계획은 일반 조회 쿼리 처럼 테이블 형태로 출력되는데 간단하게 그 내용을 정리해본다. 1. idSELECT 쿼리에 부여되는 아이디. 한 SELECT 쿼리 내에 복수개의 SELECT 문이 서브쿼리(Sub Query) 형태로 들어갈 수 있으므로 그런 경우에 id 값이 증가되어 여러행의 실행계획이 나타나게 된다. SELECT 문이 1개만 존재하는 JOIN(조인) 형태의 쿼리는 복수의 id가 부여되지 않는다. 2. select_type-SIMPLE명칭 그대로 심플한 쿼리이다. 서브쿼리같은 복잡함이 없다. -PRIMARY서브쿼리가 존재할때 가장 바깥 쿼리를 뜻한다. 복수 행의 실행계획에..
요즘 통계쪽 쿼리를 짜게되면서 DB를 공부하고있다. 보통 쿼리를 짜게되면 실행계획을 확인 한 후 쿼리를 튜닝하여 효율성 높은 쿼리를 짜게되는데 이번에 포스팅할 내용은 그 실행계획을 빠르게 수집하는 법이다. 쿼리에 2개 이상 테이블의 join이 들어갈 경우 어떤 테이블을 기준으로 조인을 거는지에 따라 수행시간이 엄청나게 차이가 날 수 있는데 이때 최적화된 조인을 위한 알고리즘은 2가지가 존재한다. 1. Exhaustive Search(철저한 탐색) 모든 경우의 수에 해당하는 비용을 계산한 후 최적의 조합을 찾는다. 확실하게 최적의 조합을 찾을 순 있겠으나 모든 경우의 수를 구하는 만큼 효율적이라고 보기 힘들다. 2. Greedy Search(탐욕스러운 탐색) optimizer_search_depth 변수에..
어려운 쿼리들은 아닌데... 헷갈려서 쓸때마다 검색을 하게됐던 쿼리들을 모으고자 한다. MySQL 버전확인 SELECT version(); 테이블이 존재하면 삭제, 존재하지않으면 경고만 발생(테이블이 없다고해서 에러를 발생시키지 않음) DROP TABLE IF EXISTS table_name; 기본키가 중복되는 데이터가 존재하면 뒷부분 update 실행, 존재하지않을경우 앞부분 insert 실행 INSERT INTO table_name(col1, col2) VALUES('a', 'b') ON DUPLICATE KEY UPDATE col1 = 'a'; 테이블명칭 조회 SHOW TABLES LIKE '%table_name%'; 테이블 컬럼 명 변경 ALTER TABLE table_name CHANGE bef..
프레임워크가 대중화되면서 공부목적이 아닌이상 프레임워크없이 쌩 서블릿으로 웹개발을 하는 경우는 거의 없어졌다. 대표적인 프레임워크로는 스프링 프레임워크가 있을텐데 이번에 설명하고자 하는건 프레임워크에 관련된건 아니고.. 어쨋든 이 프레임워크들도 서블릿 기반에서 구동되기때문에 서블릿 매핑이 1개 이상은 필요하다. appServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/appServlet/servlet-context.xml 1 appServlet *.do web.xml에 기술되는 대표적인 서블릿 매핑 일단 요청을 받는 1개 이상의 서블릿들을 생성하고 해당 서블릿이 다시 각각의 컨트롤러들에..
특정 기본키가 없으면 insert를, 있으면 update를 쳐야하는 경우가 종종 존재한다. 이때마다 애플리케이션단에서 단순하게는 if문을 사용하여 처리했었는데 mysql에 이미 이런 구문이 있는걸 알게되었다. insert문에 on duplicate key update 옵션을 사용하거나 replace 문을 사용하면 된다. INSERT INTO test(col1, col2) VALUES('a', 'b') ON DUPLICATE KEY UPDATE col1 = 'a'; REPLACE test SET col1 = 'a', col2 = 'b'; 둘다 처음 보는 문법이라하더라도 기존에 SQL을 어느정도 사용했던 사람이라면 직관적으로 알 수 있을거라고 본다(혹시 모르겠으면 댓글을...). 비슷한 용도기때문에 뭘 써야..
Spring의 RequestMapping 애노테이션을 구현해보고있는 중이다. 해당 애노테이션을 구현하려면 특정 패키지내의 클래스를 모두 읽어들여야 하는데 자바의 기본 리플렉션으로는 불가능했다.뭐 정확히 말하자면 불가능은 아니고 꽤나 코드량이 길어지는 문제가 발생했다. 패키지 이름으로 가져온다기보다 해당 디렉토리를 들어가서 파일들을 읽어오는 형식으로 짜야했어야해서...찾아보니 Reflections라는 라이브러리가 존재했다. org.reflections reflections 0.9.10 현재 최신버전인 0.9.10버전으로 의존성 추가해주고.. @Test public void 패키지_로드_테스트(){ Reflections ref = new Reflections(new ConfigurationBuilder() ..
Reactive Programming이라는건 영단어 뜻 그대로 무언가에 반응하는 프로그래밍이라는 것이다. 무언가에 반응한다는건 대표적으로 이벤트들이 존재할 것이고, 이에 대한 대표적인 디자인 패턴인 옵저버 패턴이 있다. 1. Duality네이버 사전을 검색해보면 '이중성'이라는 단어로 나오며, 수학적인 용어로는 '쌍대성'이라고 한다. 꽤나 어려운 개념이니 글로 풀어쓰는것보다는 코드로 확인해보자. List list = Arrays.asList("a", "b", "c", "d", "e") for (Iterator iter = list.iterator(); iter.hasNext(); ) { System.out.println(iter.next()); } 크게 어려운것 없는 코드다. 문자열이 들어있는 리스트를 ..
1. Generic Type Intersection제네릭은 Bounded Type Parameter, Bounded Wildcard를 이용해 제네릭에 들어오는 타입을 제한할 수 있다. public class Test { public static void main(String args[]) { method01(new ArrayList()); method02(new ArrayList()); } //Bounded Type Parameter public static void method01(List list) { } //Bounded Wildcard public static void method02(List
- Total
- Today
- Yesterday
- EffectiveJava
- backend개발환경
- Spring
- java8
- MySQL
- JavaScript Core
- OOP
- DesignPattern
- frontcode
- Jackson
- code
- http
- programming
- Design Pattern
- JPA
- clean code
- db
- mariadb
- Kotlin
- javascript
- generics
- 정규표현식
- toby
- spring cloud
- java
- TEST
- go-core
- servlet
- Git
- frontend개발환경
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |