20140219

MySQL 파티셔닝 도입해보기 (RANGE/LIST)

주문 테이블이 4천만 행 넘어가니까 인덱스 스캔도 체감 느려짐. 파티셔닝 고민하다 RANGE로 월별 파티션 걸어봄.

ALTER TABLE orders
PARTITION BY RANGE (TO_DAYS(created_at)) (
    PARTITION p201312 VALUES LESS THAN (TO_DAYS('2014-01-01')),
    PARTITION p201401 VALUES LESS THAN (TO_DAYS('2014-02-01')),
    PARTITION p201402 VALUES LESS THAN (TO_DAYS('2014-03-01')),
    PARTITION p201403 VALUES LESS THAN (TO_DAYS('2014-04-01')),
    PARTITION pmax    VALUES LESS THAN MAXVALUE
);

여기서 체크해야 할거. MySQL 5.5 파티셔닝은 PK / UK 에 파티션 키가 포함돼 있어야 함. orders의 PK가 id 하나면 파티션 불가능. PK를 (id, created_at) 로 composite로 바꿔야 되는데, 이러면 FK 건 다른 테이블에서 꼬임ㅠ

우리는 다행히 FK를 DB 제약으로 안 걸고 애플리케이션 레벨에서만 관리해서 composite PK로 돌릴 수 있었음.

파티션 프루닝 확인은 EXPLAIN PARTITIONS 로.

EXPLAIN PARTITIONS
SELECT * FROM orders WHERE created_at BETWEEN '2014-02-01' AND '2014-02-28';
-- partitions: p201402

WHERE에 created_at 없으면 전 파티션 다 뒤짐. 그래서 어플에서 조회할때 created_at 범위 같이 넣도록 ORM 쪽 래퍼를 바꿨음.

LIST 파티션은 country_code 같은 enum값으로 쪼갤 때 유용한데 우리는 거의 안 씀. 월별 RANGE가 관리 편함. 새달되면 ADD PARTITION, 오래된건 DROP PARTITION으로 초고속 삭제. DELETE랑 비교 안될정도로 빠르다.

20140203

Bootstrap 3 반응형 그리드 실전

Bootstrap 3 갈아타면서 반응형 그리드 잡아봄. 2에서 올라오면 가장 크게 걸리는게 클래스 이름이 span*col-md-* 로 바뀐거. 그리고 breakpoint가 xs/sm/md/lg 로 나눠짐.

대충 이런 식으로 만들면 모바일에선 1칼럼, 태블릿 2, 데스크톱 3이 됨.

<div class="row">
  <div class="col-xs-12 col-sm-6 col-md-4">카드 1</div>
  <div class="col-xs-12 col-sm-6 col-md-4">카드 2</div>
  <div class="col-xs-12 col-sm-6 col-md-4">카드 3</div>
</div>

주의:

  • xs에서 col 안 주면 기본이 block이라 전체 너비 차지. 그걸 의도했으면 빼도 되는데 명시하는게 좋음
  • col 합이 12 넘어가면 그 다음 col이 자동으로 다음 줄로 내려감. 행 높이 다르면 여백이 요철처럼 생기는데 .clearfix + visible-* 로 잡거나 equal height 플러그인 써야 함
  • 태블릿 두 개 나열하고 PC에서 세 개 할때 3번째에서 .clearfix.visible-sm-block 넣어야 레이아웃 안 깨짐

sm 이하에서 메뉴 접는 네비바는 .navbar-collapse 만 붙이면 자동으로 되는데, 회사 내부 관리자페이지 만들때는 굳이 반응형 안 해도 되는 경우가 많으니 오버엔지니어링 조심.

less 소스 가져다 xs/sm/md/lg 브레이크포인트 숫자만 우리 회사 레이아웃에 맞게 바꿔서 쓰는 중. 기본은 768/992/1200 이지만 우리는 디자인 기준이 990이라 미세조정.