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
와 동일한 속도를 보여주고 있다(당연한 결과겠지만 말이다).
'mysql' 카테고리의 다른 글
MySQL 8.0 RPM 설치 dnf (0) | 2024.04.08 |
---|---|
CentOS7 yum mysql 5.7 설치하기, 8.0 SSL connection error 해결 (0) | 2023.12.30 |
mysql injection 예 , SQL 인젝션 예 (0) | 2022.06.24 |
mysql 사용자 정렬 숫자를 재정렬 하려면 (0) | 2022.02.11 |
mysql auto_increment 지정 필드 재정렬 (0) | 2022.02.11 |
댓글