본문 바로가기

IT/PHP

[PHP] MySQL Fetch 함수

MySQL 테이블에 저장되어있는 값을 쿼리를 통해 선택 한 후에는, 그 값을 바로 사용할 수 없다.

그것을 PHP가 인식할 수 있는 형태로 변환해 주어야 하는데, 그것을 아래의 함수를 통해 할 수 있다.

 

 

테이블


필드명 name value
저장값 CUFFS アメサラサ

 

1. fetch_array

이 함수는 결과를 배열로 뽑아내는데, 번호로 된 배열과 필드 이름으로 된 배열 두가지가 동시에 생성된다.

위와 같은 테이블에서 데이터를 뽑아내면 fetch_array 를 통해 뽑아낸 배열의 구조는 다음과 같다.

Array (

    [0] => CUFFS

    [name] => CUFFS

    [1] => アメサラサ

    [value] => アメサラサ

)

사용법

$data = mysql_fetch_array($data_); or $data = mysqli_fetch_array($data_); or $data = $data_->fetch_array();

echo $data['name'].' => '.$data[1];

 

fetch_array의 경우 설정에 따라 번호로 된 배열로만 뽑아낼 수도 있고, 필드 이름으로만 된 배열을 뽑아낼 수도 있다.

다음과 같은 상수를 사용해서 처리할 수 있다.


MYSQL_BOTH - 기본값

        사용법 -> $data = mysql_fetch_array($data_, MYSQL_BOTH); or $data = mysqli_fetch_array($data_, MYSQL_BOTH); 
or 
$data = $data_->fetch_array(MYSQL_BOTH);

        결과 -> 위의 fetch_array 의 결과와 동일

MYSQL_ASSOC

        사용법 -> $data = mysql_fetch_array($data_, MYSQL_ASSOC); or $data = mysqli_fetch_array($data_, MYSQL_ASSOC); 
or 
$data = $data_->fetch_array(MYSQL_ASSOC);

        결과 -> 아래의 fetch_assoc 의 결과와 동일

MYSQL_NUM

        사용법 -> $data = mysql_fetch_array($data_, MYSQL_NUM); or $data = mysqli_fetch_array($data_, MYSQL_NUM); 
or 
$data = $data_->fetch_array(MYSQL_NUM);

        결과 -> 아래의 fetch_row 의 결과와 동일

 

 

 

2. fetch_assoc

이 함수는 필드 이름으로 된 배열로만 저장한다.

Array (

     [name] => CUFFS

     [value] => アメサラサ

)

사용법

$data = mysql_fetch_assoc($data_); or $data = mysqli_fetch_assoc($data_); or $data = $data_->fetch_assoc();

echo $data['name'].' => '.$data['value'];

 

 

3. fetch_row

이 함수는 숫자로 된 배열로 저장한다.

이 경우 필드의 순서를 바꾸거나 하면 전혀 다른 결과가 나올 수 있기 때문에 그것까지 고려를 해 프로그래밍 해야 한다.

Array (

    [0] => CUFFS

    [1] => アメサラサ

)

사용법

$data = mysql_fetch_row($data_); or $data = mysqli_fetch_row($data_); or $data = $data_->fetch_row();

echo $data[0].' => '.$data[1];

 

 

4. fetch_object

이 함수는 배열이 아닌 객체로 결과값을 받아온다.

stdClass Object (

    [name] => CUFFS

    [value] => アメサラサ

)

사용법

$data = mysql_fetch_object($data_); or $data = mysqli_fetch_object($data_); or $data = $data_->fetch_object();

echo $data->name.' => '.$data->value;

 

 

 

위의 4가지 함수에 대해 알아보았다.

그렇다면 위의 4가지 각각의 함수 속도는 어떻게 될 것인가?

그것에 대해 PHP 매뉴얼은 다음과 같은 답변을 내놓고 있다.

 

1. fetch_array

mysql_fetch_array()는 필드 이름으로 된 색인이 추가되지만, mysql_fetch_row() 보다 느려지지는 않는다.

2. fetch_assoc

mysql_fetch_assoc()는 필드이름으로 된 색인이 추가되지만, mysql_fetch_row() 보다 느려지지는 않는다.

3. fetch_row

언급 없음

4. fetch_object

속도면에서, 이 함수는 mysql_fetch_array()와 비슷하고, mysql_fetch_row()만큼이나 빠르다. 그러나 큰 차이는 없다.

 

그렇다면, 과연 진짜로 그런것일까.

테스트를 위해 다음과 같은 가상 환경을 제작하였다.

 

    1) 21 Fields

    2) 100,000 Records

 

$data_ = $mysqli->query("SELECT * FROM `test_table`");

while($data = $data_->fetch_array()) {}

 

다음과 같은 PHP 코드로 실행되는 함수들은, 각각 10만번의 동작을 거칠 것이다.

 

그리고 그에 대한 결과는 다음과 같이 나타났다.

 

환경: MyISAM & 21 Fields & 100,000 Records

단위: sec

fetch_array

fetch_assoc

fetch_object

fetch_row

1번째 시도

2.2280280590057

1.388512134552

3.3347442150116

1.2834389209747

2번째 시도

1.6447999477386

1.3500959873199

2.7877049446106

1.0823369026184

3번째 시도

1.7114689350128

1.303701877594

2.8545777797699

1.0900609493256

4번째 시도

1.8702390193939

1.5157608985901

3.1205198764801

1.1778881549835

5번째 시도

1.6467909812927

1.3309321403503

2.7673869132996

1.1073391437531

평균

1.82026538848874

1.37780060768126

2.97298674583436

1.14821281433106

 

fetch_object > fetch_array > fetch_assoc > fetch_row 의 순서를 보여주고 있다.

 

결과를 자세히 보면, 10만개의 데이터를 뽑는데 걸리는 시간은 길어봐야 3초 밖에 되지 않는다.

그러나 어느 특정한 경우를 제외하면 10만개의 데이터를 동시에 뽑아내는 사람은 없을 것이다.

그렇기에 PHP 매뉴얼의 말도 일리는 있지만, 차이는 존재한다.

 

기왕 시작한 김에, 위의 fetch_array 시 상수를 통해 컨트롤 할 수 있는 부분의 속도도 체크해보았다.

 

환경: MyISAM & 21 Fields & 100,000 Records fetch_array

단위: sec

MYSQL_BOTH

MYSQL_ASSOC

MYSQL_NUM

1번째 시도

2.0118298530579

1.3998398780823

1.1996338367462

2번째 시도

1.8045439720154

1.630038022995

1.3843371868134

3번째 시도

1.703469991684

1.3845191001892

1.2655489444733

4번째 시도

1.7362868785858

1.393550157547

1.1305871009827

5번째 시도

1.7584209442139

1.3735721111298

1.1451189517975

평균

1.8029103279114

1.43630385398866

1.22504520416262

 

MYSQL_BOTH = fetch_array

MYSQL_ASSOC = fetch_assoc

MYSQL_NUM = fetch_row

와 동일한 속도를 보여주고 있다(당연한 결과겠지만 말이다).

출처 : 
http://blog.naver.com/mhmspecial