เมื่อทำการคิวรี่ข้อมูลใน mysql มันจะทำในลักษณะ buffer เป็นหลัก ข้อดีของวิธีการทำแบบนี้คือ ผลลัพธ์จากการคิวรี่จะถูกส่งจาก MySQL Server ไปยัง PHP และเก็บไว้ใน memory ของ PHP process ซึ่งทำให้สามารถทำ Operation หลายๆ อย่างได้ เช่น นับจำนวนแถว ย้าย pointer ของ current result นอกจากนี้ยังทำให้สามารถคิวรี่ข้อมูลต่อไปได้โดยใช้คอนเนคชั่นเดิม ขณะที่ยังทำงานบน result set ได้ ข้อเสียคือ ยิ่งขนาดของ result set ใหญ่เท่าไหร่ มันก็ต้องใช้หน่วยความจำมากขึ้นไปเท่านั้น หน่วยความจำจะถูกใช่้งานต่อไปจนกว่าทุก ๆ การอ้างถึงของของ result set นั้นจะถูกยกเลิก หรือ บังคับให้ฟรีหน่วยความจำ (จะทำโดยอัตโนมัติ ระหว่างรีเควสจบตัวสุดท้าย) คำว่า “store result” ใช้แทนโหมดนี้ เนื่องจากผลลัพธ์ทั้งหมดของ result set นั้นถูกเก็บไว้

Note:
ถ้าใช้ libmysqllibrary เป็น library ของ PHP ค่า PHP’s memory limit จะไม่นับรวม memory ที่ใช้กับ result sets ยกเว้นกรณีที่data นั้นถูกเก็บไว้ใน PHP variable ขณะที่ mysqlnd หน่วยความจำทั้งหมดจะถูกนับรวมไปด้วย

ขณะที่ unbuffered MySQL จะทำการคิวรีและจะส่งกลับ resource ขณะที่ data นั้นยังคงรอคอยอยู่ที่ MySQL server เพื่อรอคอยการดึง ซึ่งจะใช้หน่วยความจำที่ PHP sev3er น้อยกว่า ซึ่งจะทำให้โหลดของ Server ดีขึ้น ถ้า result set ทั้งหมดไม่ถูกดึงไปจาก server จะไม่สามารถ query ข้อมูลตัวถัดไปโดยใช้ connection เดิมได้ ซึ่งเรามักจะใช้คำว่า “use result” แทนมัน

ด้วยคุณลักษณะเหล่านี้ การใช้งาน buffered queries ควรตใช้งานในลักษณะที่เรามีการกำหนด limit ให้มัน หรือต้องรู้จำนวนแถวก่อนที่จะทำการอ่านข้อมูลทั้งหมด ขณะที่ unbuffered โหมดนั้นควรจะใช้งานเมื่อเรารู้ว่าข้อมุลนั้นมีขนาดใหญ่มากๆ

เนื่องจาก buffered queiries นั้นเป็นค่าเริ่มต้น ดังนั้นเวลาเรียกใช้งานจึงต้องเพิ่มเล็กน้อยดังนี้

ตัวอย่าง 1 : mysqli

<?php $mysqli  = new mysqli("localhost", "my_user", "my_password", "world"); $uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);

if ($uresult) {
while ($row = $uresult->fetch_assoc()) {
echo $row['Name'] . PHP_EOL;
}
}
$uresult->close();
?>

ตัวอย่าง 2 : mysql ( not recommeded : เนื่องจากไม่มีการ support โดยทีมงาน PHP อีกต่อไป)

<?php $conn = mysql_connect("localhost", "my_user", "my_pass"); $db   = mysql_select_db("world"); $uresult = mysql_unbuffered_query("SELECT Name FROM City"); if ($uresult) { while ($row = mysql_fetch_assoc($uresult)) { echo $row['Name'] . PHP_EOL; } } ?>

ตัวอย่าง 3 : pdo


<?php $pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$uresult = $pdo->query("SELECT Name FROM City");
if ($uresult) {
while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
echo $row['Name'] . PHP_EOL;
}
}
?>

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s