티스토리 뷰

Select ... Limit 2000, 1000; 과 같은 페이지 나누는 쿼리 튜닝을 조사하다가

커버링 인덱스 (http://gywn.net/2012/04/mysql-covering-index/) 에 대해 알게 되었고

운영중인 mysql DB 서버에 쿼리를 날려보았다.


일반적 limit 쿼리일 경우 53.8ms ~ 63.1 ms 의 조회 시간이 소요되던것이

커버링 인덱스 쿼리일 경우 23.6 ms 로 1/2 속도 향상이 있음을 알 수 있었다.


아래와 같은 커버링 인덱스 쿼리를

select a.* 

from ( 

    select ID from ARTICLE order by UID limit 50000, 10000

) b JOIN ARTICLE a ON b.ID = a.ID;

Laravel 의 쿼리 빌더로는 어떻게 표현해야 할 수 있을까?


커버링 인덱스가 self join 의 구조를 가지기에

아래와 같이 표현하면 된다.

$subSql = DB::table("ARTICLE")->orderBy("ID")->skip("50000")->take("10000");

$rows = DB::table("ARTICLE as a")->join(DB::raw("({$subSql->toSql()}) as b"), "a.ID", "=", "b.ID")->mergeBindings($subSql)->select("a.*")->get();


참고

https://stackoverflow.com/a/30587685

댓글