เทคนิคการนับจำนวน record ของข้อมูลด้วย sql

เทคนิคการนับจำนวน record ของข้อมูล มี 3 วิธีหลักๆครับ
<?php
    $sql = mysql_query("SELECT * FROM table_name");
    $records = mysql_num_rows($sql);
?>

วิธีแรกเป็นการ query เอาข้อมูลทั้งหมดออกมาจากฐานข้อมูลครับ วิธีนี้ทำงานได้ดีกับฐานข้อมูลขนาดเล็กทั่วๆไป รวมถึงฐานข้อมูลแบบ InnoDB และเหมาะสมที่สุดหากต้องการนำข้อมูลที่ได้ไปใช้งานต่อทันที นอกจากทำการนับจำนวนข้อมูล เนื่องจาก MySQL จะทำการ query ข้อมูลทั้งหมดออกมาจากฐานข้อมูลในคราวเดียว
<?php
    $sql = mysql_query("SELECT COUNT(*) FROM table_name");
    $res = mysql_fetch_array($sql);
    $records = $res[0];
?>

วิธีนี้เหมาะสมกับการนับจำนวนข้อมูลเพียงอย่างเดียวเช่นการนับจำนวนข้อมูลทั้งหมดเพื่อแบ่งหน้า ซึ่งจะต้องไป query เอาข้อมูลจริงๆออกมาใช้งานอีกครั้งหนึ่ง ซึ่งเหมาะสมหากฐานข้อมูลที่ใช้งานมีขนาดใหญ่

ผมยกตัวอย่างการใช้งานเช่น วิธีแรก การนับจำนวน record เพียงอย่างเดียวจะได้ข้อมูลออกมาทั้งฐานข้อมุล ซึ่งถ้าไม่ได้ใช้ประโยชน์อะไรกับข้อมูลที่ได้ (หรือใช้งานแค่เพียงบางส่วน เช่นการแบ่งหน้า ที่ต้องนับจำนวน record ทั้งหมด แต่ต้องการแสดงผลแค่ไม่กี่รายการ) วิธีแรกจะไม่เหมาะสม เนื่องจากระบบจะต้องใช้หน่วยความจำจำนวนมหาศาลกับข้อมูลทั้งหมด ในขณะที่วิธีที่ 2 ใช้หน่วยความจำเพียงเล็กน้อยเท่านั้น

แต่วิธีที่ 2 ก็ไม่เหมาะกับการใช้งานกับฐานข้อมูลชนิด InnoDB ครับ เนื่องจาก InnoDB ถูกออกแบบมาสำหรับการเขียนมากกว่าการอ่านทำให้การนับจำนวน record บน InnoDB ทำได้เชื่องช้ากว่า MyISAM ซึ่งในกรณีของ InnoDB เขาแนะนำให้ใช้แบบแรกครับ แต่ก็มีคำแนะนำเล็กๆน้อยๆหากไม่ต้องการให้เปลืองทรัพยาการมากนัก เราอาจเขียนคำสั่งเลือกเพียงบาง field ออกมาก็ได้ครับ
<?php
    $sql = mysql_query("SELECT id FROM table_name");
    $records = mysql_num_rows($sql);
?>

วิธีด้านบนก็จะช่วยให้การทำงานกับ InnoDB เร็วขึ้น
<?php
    $sql = mysql_query("SHOW TABLE STATUS LIKE 'table_name'");
    $res = mysql_fetch_assoc($sql);
    $records = $res['Rows'];
?>

วิธีที่ 3 วิธีสุดท้าย (ที่คิดออก) เป็นการนับจำนวน record ทั้งหมดจาก information_schema ของฐานข้อมูลโดยตรง ซึ่งจะทำให้ได้ความเร็วในการเรียกข้อมูลสูงสุด แต่ก็มีข้อเสียที่สำคัญคือไม่สามารถใช้ร่วมกับเงื่อนไขได้ครับ เป็นการอ่านจำนวน record ที่บันทึกไว้ของฐานข้อมูลเพียงอย่างเดียว
ผู้เขียน goragod โพสต์เมื่อ 01 ก.ย. 2554 เปิดดู 35,264 ป้ายกำกับ SQL
^