สำหรับตัวอย่างนี้จะเป็นการ JOIN ตาราง 2 ตาราง
1. tb_reject_hd
2. tb_reject_desc
ซึ่งจะเชื่อมกันด้วยฟิลด์ docno
จะเห็นว่าเราสามารถคิวรี่เรียกข้อมูลออกมาได้ตอนที่ยังไม่ใส่ ORDER BY
แต่เมื่อใส่ ORDER BY เข้าไป จะหมุนค้างจนหน้าเว็บหยุดทำงาน
ซึ่งในตัวอย่างนี้จะสร้างตารางใหม่ขึ้นมาจากตารางเดิม เปลี่ยนชื่อเป็น tb_reject_desc_with_index
และทำการเพิ่ม INDEX KEY เข้าไป
เมื่อทดสอบคิวรี่แบบมี ORDER BY จะเห็นว่าสามารถแสดงผลได้ทันที
จากการสังเกตตัวเลขเวลาในการประมวลผล จะเห็นได้ว่าแบบไม่ใช้ ORDER BY จะทำงานเร็วกว่า แต่ในการทำงานส่วนใหญ่ก็มักจะต้องใช้ ORDER BY อย่างหลีกเลี่ยงไม่ได้
เช่นกรณีค้นหา แบบเรียงลำดับ
ตัวอย่างโค้ดคิวรี่ข้อมูลจากตารางที่ Add Index Key แล้ว
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Add Index Key</title>
</head>
<body>
<h2>ORDER BY with INDEX KEY</h2>
<?php
include 'db_connection.php';
$start = microtime( true );
$sql = "SELECT
tbMaster.docno,
tbMaster.userkey,
tbMaster.docdate,
tbMaster.timekey,
tbDetail.id_number,
tbMaster.create_date
FROM
tb_reject_hd AS tbMaster
INNER JOIN
tb_reject_desc_with_index AS tbDetail ON tbMaster.docno = tbDetail.docno
ORDER BY
tbMaster.docdate DESC,
tbMaster.timekey DESC
LIMIT 10 ";
$query = $pdo->prepare($sql);
$query->execute();
$data = array();
echo '<pre> '. $sql .'</pre>';
echo '<table border="1">';
echo '<tr>
<th>No</th>
<th>User</th>
<th>Date</th>
<th>Time</th>
<th>ID</th>
<th>Date Record</th>
</tr>';
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
echo '<tr>
<td>'. $row['docno'] .'</td>
<td>'. $row['userkey'] .'</td>
<td>'. $row['docdate'] .'</td>
<td>'. $row['timekey'] .'</td>
<td>'. $row['id_number'] .'</td>
<td>'. $row['create_date'] .'</td>
</tr>';
}
echo '</table>';
echo '<br><h3>',(microtime(true) - $start).'</h3>';
?>
</body>
</html>
ตัวอย่างโค้ดที่ดึงข้อมูลจากตารางที่ยังไม่ทำ INDEX
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>No Index Key, No ORDER BY</title>
</head>
<body>
<h2>no ORDER BY, no INDEX KEY</h2>
<?php
include 'db_connection.php';
$start = microtime( true );
$sql = "SELECT
tbMaster.docno,
tbMaster.userkey,
tbMaster.docdate,
tbMaster.timekey,
tbDetail.id_number,
tbMaster.create_date
FROM
tb_reject_hd AS tbMaster
INNER JOIN
tb_reject_desc AS tbDetail ON tbMaster.docno = tbDetail.docno
LIMIT 10 ";
$query = $pdo->prepare($sql);
$query->execute();
$data = array();
echo '<pre> '. $sql .'</pre>';
echo '<table border="1">';
echo '<tr>
<th>No</th>
<th>User</th>
<th>Date</th>
<th>Time</th>
<th>ID</th>
<th>Date Record</th>
</tr>';
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
echo '<tr>
<td>'. $row['docno'] .'</td>
<td>'. $row['userkey'] .'</td>
<td>'. $row['docdate'] .'</td>
<td>'. $row['timekey'] .'</td>
<td>'. $row['id_number'] .'</td>
<td>'. $row['create_date'] .'</td>
</tr>';
}
echo '</table>';
echo '<br><h3>',(microtime(true) - $start).'</h3>';
?>
</body>
</html>
หากลองเพิ่ม
ORDER BY
tbMaster.docdate DESC,
tbMaster.timekey DESC
แล้วรันทดสอบอีกครั้งในตารางที่ไม่ทำ INDEX จะพบว่าหน้าเว็บค้างและหยุดทำงานไปในที่สุด
สำหรับโครงสร้างตารางทั้ง 3 ตาราง ดาวน์โหลดได้ ที่นี่
ความคิดเห็น
แสดงความคิดเห็น