본문 바로가기

SQL4

[MySQL] 대용량 데이터 select 시 limit 사용 주의점 대용량 데이터를 RDB 로 관리하던 중, 아래와 같이 limit offset 을 사용하며 select 할 때 문제가 있었다. -- 0부터 시작하는 offset 은 빨랐지만 SELECT * FROM my_table LIMIT 0, 5000; -- offset 이 높을수록 성능이 저하가 되었다. (속도 느림) SELECT * FROM my_table LIMIT 1000000, 5000; 조금만 구글링해도 나오는 원인이었는데.. 단순 LIMIT 는 인덱스를 타지 않아서 두번째 쿼리 같은 경우는 100만번까지 쿼리를 읽고 거기에서 5천개를 가져오는거라서 느릴 수 밖에 없었다. 그에 따른 해결방법은 아래와 같았음을 기록.. -- #1. SELECT * FROM my_table WHERE my_table_pk BE.. 2020. 12. 22.
[Mybatis] update 문 parametertype 을 map 으로 받아 foreach 처리하는 방법 서비스를 하다가, 모든 유저의 이름을 '홍길동' 으로 바꿔야 할때. 그 객체를 Map 으로 가지고 있는 경우에 대해 포스팅하겠습니다. (위에서 언급한 '그' Map 객체) // Map 구조 (id:userName} 'hajs' = {'홍길동'}, 'user01' = {'홍길동'}, 'user02' = {'홍길동'}; 우선 Mapper 에서 param 을 Map 으로 전달해주고, void updateUserName(@param("userNameMap") Map userNameMap); xml 에서는 (아래처럼) update 문에 foreach 돌리면서 처리하면 된다. UPDATE user SET user_name = CASE WHEN user_id = #{userId} THEN #{user_name} EN.. 2020. 5. 18.
[MyBatis] #{} 와 ${} 의 차이 MyBatis Framework 를 사용하여 개발을 하다가 문득, 이런 생각을 했다. " 다른 사람들 코드를 보면 ${} 로도 하던데, 내가 쓰는 #{} 와 무슨 차이가 있을까? " 결론만 말하자면, #{} 는 String 을 표현해준다. 즉, 앞 뒤로 홀따옴표(') 를 붙여준다 :) INSERT INTO user ( id, name ) VALUES ( #{id}, #{name} ) --> VALUES ('homeju1', '홈주') 반면, ${} 는 있는 그대로를 표현해준다. 그렇기 때문에 숫자형을 사용할 때 좋다 :) INSERT INTO user ( id, age ) VALUES ( #{id}, ${age} ) --> VALUES ('homeju1', 26) 2020. 4. 2.
unsigned 사용하는 이유 DB Table 생성시 PK 값이 될 컬럼에 unsigned 를 지정하는 일이 있어서 찾아봤다. 와 같이 값의 범위에서 음수는 제외되고 그 범위만큼 양수가 늘어난다.시퀀스, 인덱스처럼 0부터 순차적으로 늘어나는 컬럼이라면 unsigned 를 활용하면 좋을 것 같다. 2018. 10. 29.