출처1 : http://www.mysqlkorea.com/sub.html?mcode=develop&scode=01&lang=k&m_no=21838&cat1=12&cat2=359&cat3=374

출처2 : https://blog.naver.com/hschoi82/20050239561


2018/07/24 - [프로그램 자료/MySQL & MariaDB] - [MySQL & MariaDB] 동적 프로시저 dynamic procedure



SQL_CALC_FOUND_ROWS 키워드와 FOUND_ROWS() 함수를 이용하여 Limit를 제외한 Select 문장의 전체 로우 수를 캐쉬에 저장하는 방법이다.

MYSQL 매뉴얼에선 일반적인 방법으로 조회를 2번 하는것보다빠르다고 한다.

실제로 테스트 해보면 캐쉬 사용 문제로 더 느릴수도 있다고 한다.




기본 베이스는 아래와 같다.


SELECT SQL_CALC_FOUND_ROWS *

FROM   tabaleName

LIMIT  0, 10;

 

SELECT FOUND_ROWS();



다음은 동적쿼리로 사용시 샘플이다.



DELIMITER $$

 

USE `demoDB`$$

 

    DROP PROCEDURE IF EXISTS proc_name$

   

    CREATE DEFINER='userId'@'%' PROCEDURE proc_name

    (

        in pOffset int,

        in pSize int,

        out totalCount int

    )

    LANGUAGE SQL

    NOT DETERMINISTIC

    CONTAINS SQL

    SQL SECURITY DEFINER

    COMMENT '테스트 프로시저'

    BEGIN

       

        SET @pOffset := IFNULL(pOffset, 0);

        SET @pSize := IFNULL(pSize, 10);

 

        SET @Sql = "";

        SET @Sql = CONCAT(@Sql, CHAR(10),"select SQL_CALC_FOUND_ROWS * ");

        SET @Sql = CONCAT(@Sql, CHAR(10),"from tableName");

        SET @Sql = CONCAT(@Sql, CHAR(10),"limit ?,?");

        #select @Sql;

       

        PREPARE dquery FROM @Sql;

        EXECUTE dquery USING @pOffset, @pSize;

 

        SET totalCount := FOUND_ROWS();

       

    END$$

DELIMITER ;


Posted by motolies

댓글을 달아 주세요