포럼
[Maserati] 개발자를 위한 변경 사항
2013.02.01 12:06
- 대용량 데이터를 DB에서 가져올 때 성능 향상
- 현재 XE에서는 대용량 데이터를 DB에서 가져올 때, 가져온 모든 데이터를 PHP에서 fetching, buffering하게 되는데요. 이 과정을 생략해서 SQL 쿼리로 인한 메모리 사용량을 줄일 수 있다고 합니다.
- executeQuery(), executeQueryArray()의 4번째 인자 ($buffered 변수)를 FALSE로 하면 됩니다.
- executeQuery(), executeQueryArray()에 콜백 함수 지정 가능
- DB에서 가져온 데이터를 가공하려면 executeQuery()나 executeQueryArray() 다음에 처리 프로세스를 작성해줘야 하는데 이제는 그럴 필요 없이 콜백 함수를 지정하면 쿼리 실행 후 해당 함수를 호출하게 됩니다.
- 이를 이용해서 코드를 간결하게 정리할 수 있습니다.
executeQuery($query_id, [$args], [$args_columns = NULL], [$buffered= TRUE | FALSE], [$callback = NULL])
executeQueryArray($query_id, [$args], [$args_columns = NULL], [$buffered= TRUE | FALSE], [$callback = NULL])
(계속 추가됩니다...)
댓글 9
-
KANTSOFT
2013.02.01 13:57
-
퍼니엑스이
2013.02.01 17:09
쿼리를 날렸을 때 메모리에 쿼리에 대한 결과값이 저장되는데 이 과정을 생략해서 메모리를 절약하는 것 같네요.
http://www.php.net/manual/en/function.mysql-unbuffered-query.php
해석하실 수 있으시면 한 번 보세요.
-
푸시아
2013.02.01 22:12
php5.5 부터 안될거라고 하는데... 사용하더라도 php 쓰는것 보다 0.1% 정도 빨라진다는것 아닌가요?
-
퍼니엑스이
2013.02.01 22:21
PHP 5.5부터는 mysql_로 시작하는 함수가 모두 Depreated 상태로 된다고 합니다.
대신에 MySQLi나 PDO_MySQL을 써야하고요 PHP 5.5는 아직까지 정식 버전이 아닌 알파 버전으로 한참 개발중입니다.
따라서, PHP 5.5는 고려대상이 아니라고 볼 수 있습니다.
그리고... 0.1% 정도 빨라진다는게 어디에 나와있나요? 대용량 데이터베이스에 대한 방안으로 나와있으니 0.1%가 아니라 더 큰 효율성을 가지지 않을까 생각합니다.
-
푸시아
2013.02.01 22:45
제가 해석능력이 좀딸려서 그런데 좀 헷갈리네요..
http://www.php.net/manual/en/mysqlinfo.api.choosing.php
Recommended API
It is recommended to use either the mysqli or PDO_MySQL extensions. It is not recommended to use the old mysql extension for new development, as it has been deprecated as of PHP 5.5.0 and will be removed in the future. A detailed feature comparison matrix is provided below. The overall performance of all three extensions is considered to be about the same. Although the performance of the extension contributes only a fraction of the total run time of a PHP web request. Often, the impact is as low as 0.1%.
-
푸시아
2013.02.01 16:49
그럼 fetch 하는것과 callback 하는것을 php로 처리하는것보다 dbms 에서 처리하는것이 더 빠르고 효율적이란 말씀인가요?
-
푸시아
2013.02.01 23:07
아.. 맞네요. 언버퍼 쿼리의 경우 대용량 쿼리일때 쿼리가 다 끝나기도 전에 결과물 일부를 보여줄 수 있는것이고 그래서 모든 행의 양을 알 필요가 있을때는 무의미 한가보네요. 상상하자면, 100만 글이 있는 게시판에서 게시물 view의 경우 언버퍼로 쿼리하면 빨리 나오고 대신 이게 전체 몇개 글중에 몇번째 글인지는 늦게 나오는게 되는건가요? 메모리는 php보다 적게 먹지만 서버 로드는 증가할 수 있다고 하네요. 서버로드가 뭘 뜻하는건지...CPU인가.. 암튼 저도 대용량 디비를 mysql 에 담아서 개발하는지라 관심이 많습니다 ㅠㅠ
-
난다날아
2013.02.04 14:35
select한 result set의 row가 몇 십만 개라고 생각하면 buffered 방식의 경우 result set를 모두 PHP로 가져와 처리하기 때문에 메모리 오버가 생길 수도 있습니다. unbuffered 방식은 result set를 한번에 모두 PHP로 주지 않고 fetch 때만 mysql 서버에서 PHP로 한 row에 대한 정보만 전송됩니다.
buffered 방식은 result set을 PHP가 전부 가지고 있기 때문에 result set의 전체 row 개수라든지 seek가 가능합니다.
unbuffered 방식은 위 기능을 사용할 수 없습니다. 대신 메모리 사용량에서 이득을 볼 수 있습니다.
속도는 둘 중 어느 것이 빠른지 아직 잘 모르겠습니다. 다만, 메뉴얼 상으론 unbuffered 방식이 속도에서 약간 손해 본다고 읽었던 것 같습니다.
메뉴얼에 따르면 result set의 크키를 알고 있을 때, 혹은 row 개수나 seek가 필요할 때는 buffered 방식을
result set의 크기를 알 수 없을 때는 unbuffered 방식을 사용하라고 되어 있습니다.
개발하며 두가지 방식을 적절히 사용하시면 될 것 같습니다. XE 전체의 쿼리를 둘 중 어떤 방식으로 변경하지는 않을 겁니다.
ps. 저도 이번에 새롭게 알게 되었습니다. buffered/unbuffered query에 대해서요.
-
웹엔진
2013.02.11 23:29
일반 PHP에서는 buffered와 unbuffered 어떻게 지정하나요?
buffering을 false하게되면 실제로 데이터가 사용되지 않는건 메모리에 위치하지 않는다는건가요?
쿼리실행후 바로 callback은 편리하긴 하겠네요.