ถามเรื่องประสิทธิภาพการ query คำสั่ง SQL ครับ อยากทราบว่าแบบไหนจะมีประสิทธิภาพมาก และเร็วกว่ากันครับ
การ SELECT ข้อมูลออกมาโชว์ในบางที เราสามารถทำการ SELECT ได้เลยทีเดียว โดยการ SELECT ซ้อน SELECT อีกที หรือใช้วิธีการ JOIN table
ไม่จำเป็นต้องมา SELECT ก่อนแล้วนำ ค่าที่ได้จากการ SELECT รอบแรกมา SELECT ค่าต่อไป
แต่วิธีการนี้จะต้องอาศัยความเชี่ยวชาญ SQL มากขึ้นหน่อย
แต่อยากรู้ว่ามันจะ มีประสิทธิภาพ หรือความไวในการ query มากกว่าหรือเปล่าครับ
ตัวอย่างนะครับ
การออกแบบ table ในลักษณะ Master - Detail
ขอยกตัวอย่างลักษณะ table เว็บบอร์ด เลยนะครับ
Quote: ตารางเก็บหัวข้อของเว็บบอร์ด
tb_topic
- board_topic_id
- board_topic_title
- board_topic_detail
- board_topic_by //อ้างอิงถึง member_id ที่ตาราง tb_member
- board_topic_date
Quote: ตารางเก็บความคิดเห็นของหัวข้อนั้นๆ
tb_comment
- board_comment_id
- board_topic //อ้างอิงถึง board_topic_id ที่ตาราง tb_topic
- board_comment_detail
- board_comment_by //อ้างอิงถึง member_id ที่ตาราง member
- board_comment_date
Quote: ตารางเก็บหัวข้อของเว็บบอร์ด
tb_member
- member_id
- member_name
จะเห็นได้ว่าการที่เราจะ query ข้อมูลออกมาโชว์นั้น ทำได้หลายรูปแบบมากๆ
ขอยกตัวอย่างเป็น ภาษา php ที่ใช้ในการ ช่วย query นะครับ
ส่วนผลลัพธ์การ query ของตัวอย่างที่ต้องการคือ
ต้องการแสดง หัวเรื่องของกระทู้ , ผู้ตั้งกระทู้ , ตั้งกระทู้เมื่อเวลา , จำนวนคนที่ตอบกระทู้ , ผู้ตอบกระทู้ล่าสุด , ตอบกระทู้ล่าสุดเมื่อเวลา
ขอเริ่มจากวิธีที่ 1 เลยนะครับ เชื่อว่าโปรแกรมเมอร์มือใหม่ (รวมถึงผมตอนแรกๆด้วย ) ขอเป็นวิธีที่แย่ที่สุด ซึ่งหลายๆคนอาจไม่ได้ทำขนาดนี้ แต่อาจจะดีกว่านี้หน่อย
การที่จะ query ให้ได้ตามโจทย์ข้างบนนั้น ทำได้ง่ายๆโดย
1. query select หากระทู้ก่อน (topic)
2. นำมา loop จำนวนตามกระทู้ นั้นๆ ที่ได้มาจากการ query ในขั้นตอนที่ 1.
3. ใน loop ของ query ในขั้นตอนที่ 1. ก็ทำการ query select หาจำนวนคนที่ตอบกระทู้ , ผู้ตอบล่าสุด , ตอบกระทู้ล่าสุดเมื่อเวลา....
ซึ่งสามารถเขียนโค้ด ได้ประมาณนี้ครับ
Code (PHP)
$query_1 = mysql_query("SELECT * FROM tb_topic");
while($result_1 = mysql_fetch_array($query_1)){
$topic_id = $result_1["board_topic_id"];
$topic_title = $result_1["board_topic_title"];
$topic_by = $result_1["board_topic_by"];
$topic_date = $result_1["board_topic_date"];
//query เพื่อหาชื่อของผู้ตั้งกระทู้ (member_name) ที่ตาราง tb_member
$query_2 = mysql_query("SELECT member_name FROM tb_member WHERE member_id='".$topic_by."'");
$result_2 = mysql_fetch_array($query_2);
$topic_by_name = $result_2["member_name"];
//query เพื่อหาความคิดเห็นล่าสุด ,ตอบกระทู้ล่าสุดเมื่อเวลา... ของ topic นี้ ที่ตาราง tb_comment
$query_3 = mysql_query("SELECT * FROM tb_comment WHERE board_topic='".$topic_id."' ORDER BY board_comment_date DESC");
$result_3 = mysql_fetch_array($query_3);
$comment_by = $result_3["board_comment_by"];
$comment_date = $result_3["board_comment_date"];
//query เพื่อหาชื่อของผู้แสดงความคิดเห็น (member_name) ที่ตาราง tb_member
$query_4 = mysql_query("SELECT member_name FROM tb_member WHERE member_id='".$comment_by."'");
$result_4 = mysql_fetch_array($query_4);
$comment_by_name = $result_4["member_name"];
//query เพื่อหาจำนวนของ ผู้ที่มาแสดงความคิดเห็น ในกระทู้นั้นๆ
$query_5 = mysql_query("SELECT COUNT(*) AS count_comment FROM tb_comment WHERE board_topic='".$topic_id."'");
$result_5 = mysql_fetch_array($query_5);
$count_comment = $result_5["count_comment"];
//ตัวแปรที่นำไปใช้งาน ในการแสดงผล
//$topic_id --> id ของกระทู้นั้น สำหรับทำ Link
//$topic_title --> หัวข้อของกระทู้นั้น
//$topic_date --> ตั้งกระทู้เมื่อ??
//$topic_by_name --> ตั้งกระทู้โดย
//$comment_by_name --> คอมเม้นล่าสุดโดย
//$count_comment --> จำนวนคอมเม้น
//$comment_date --> คอมเม้นล่าสุดเมื่อไหร่
}
จะเห็นได้ว่า วิธีแรก กว่าจะทำ query เพื่อให้ได้ผลลัพธ์ ที่ต้องการ นั้น ต้องใช้การ query หลายครั้งมากๆ
จะคิดจำนวนครั้งที่ query ทั้งหมดได้ตามนี้ 1 + (N * 4)
โดยที่ 1 หมายถึงการ query หาจำนวน(query ก่อนทำการ loop) กระทู้ทั้งหมด และ N หมายถึงจำนวน ข้อมูลใน topic
เช่น
มีกระทู้ทั้งหมด 100 กระทู้ การที่เรา จะ query ข้อมูลของ 100 กระทู้นั้น เราต้อง query ทั้งหมด 1+(100*4) คือ 401 ครั้งนั้นเอง
มาต่อวิธีที่ 2 นะครับ วิธีนี้เริ่มใช้การ JOIN table มาขึ้นจะลดคำสั่ง query ลดได้บ้าง ซึ่งจริงๆแล้ว หลายๆคนอาจจะใช้วิธีประมาณนี้อยู่มากกว่า วิธีที่ 1
Code (PHP)
$query_1 = mysql_query("SELECT board_topic_id ,board_topic_title ,board_topic_date ,member_name AS topic_by_name FROM tb_topic INNER JOIN tb_member ON member_id=board_topic_by");
while($result_1 = mysql_fetch_array($query_1)){
$topic_id = $result_1["board_topic_id"];
$topic_title = $result_1["board_topic_title"];
$topic_date = $result_1["board_topic_date"];
$topic_by_name = $result_1["topic_by_name"];
//query เพื่อหาความคิดเห็นล่าสุด , จำนวนความคิดเห็นทั้งหมด , ผู้ตอบความคิดเห็นล่าสุด ,ตอบกระทู้ล่าสุดเมื่อเวลา... ของ topic นี้ ที่ตาราง tb_comment
$query_2 = mysql_query("SELECT member_name AS comment_by_name , board_comment_date , COUNT(*) AS count_comment FROM tb_comment INNER JOIN tb_member ON member_id=board_comment_by WHERE board_topic='".$topic_id."' ORDER BY board_comment_date DESC");
$result_2 = mysql_fetch_array($query_2);
$comment_by_name = $result_2["comment_by_name"];
$comment_date = $result_2["board_comment_date"];
$count_comment = $result_2["count_comment"];
//ตัวแปรที่นำไปใช้งาน ในการแสดงผล
//$topic_id --> id ของกระทู้นั้น สำหรับทำ Link
//$topic_title --> หัวข้อของกระทู้นั้น
//$topic_date --> ตั้งกระทู้เมื่อ??
//$topic_by_name --> ตั้งกระทู้โดย
//$comment_by_name --> คอมเม้นล่าสุดโดย
//$count_comment --> จำนวนคอมเม้น
//$comment_date --> คอมเม้นล่าสุดเมื่อไหร่
}
วิธีนี้ย่อ คำสั่ง query ไปได้เยอะเลยครับ จะเห็นได้ว่า ใน loop มีการ query เพิ่มครั้งเดียว
เพราะฉะนั้นจำนวน query จะได้เท่ากับ 1 + (N * 1)
ถ้ามีกระทู้ทั้งหมด 100 กระทู้ จะทำการ query แค่ 1 + (100 * 1) เท่ากับ 101 ครั้งเอง
จำนวนครั้งที่ query ก็ยังเยอะอยู่ดี
สำหรับการออกแบบระบบ ขนาดใหญ่ ลองคิดเล่นๆ พวกเว็บบอร์ดใหญ่ๆ มีคนใช้งานพร้อมกันเยอะๆ
ถ้าต้องมา query เพื่อการแสดงผล 1 คน เอาแค่ การ query เพื่อแสดง list กระทู้ในเว็บบอร์ด ยังไม่รวม การ query ในส่วนอื่นๆ ของ ใน pageนั้นอีก ก็ปาเข้าไป มากกว่า 101 query แล้ว
user ใช้พร้อมกัน 100 ขน ในเวลาเดียวกัน ก็ เป็น หมื่นๆ query เลย
หลายๆคนอาจเริ่มคิดแล้วว่า เราจะย่อ query ให้เหลือแค่ครั้งเดียวเป็นไปได้ไหม แล้ว แสดงผล ตามต้องการข้างต้น
คำตอบคือได้ ครับ
มาลองดูวิธีที่ 3 วิธีสุดท้ายดู การ query เพื่อให้ได้ผล ทั้งหมดในคำสั่งเดียว ซึ่งคำสั่ง query จะยาวหน่อย
Code (PHP)
$query = mysql_query("SELECT board_topic_id ,board_topic_title ,board_topic_date ,member_name AS topic_by_name ,(SELECT member_name FROM tb_comment INNER JOIN tb_member ON member_id=board_comment_by WHERE board_topic=board_topic_id ORDER BY board_comment_date DESC LIMIT 0,1) AS comment_by_name ,(SELECT board_comment_date FROM tb_comment INNER JOIN tb_member ON member_id=board_comment_by WHERE board_topic=board_topic_id ORDER BY board_comment_date DESC LIMIT 0,1) AS comment_date ,(SELECT count(*) FROM tb_comment WHERE board_topic=board_topic_id) AS count_comment FROM tb_topic INNER JOIN tb_member ON board_topic_by=member_id");
while($result = mysql_fetch_array($query)){
$topic_id = $result["board_topic_id"];
$topic_title = $result["board_topic_title"];
$topic_date = $result["board_topic_date"];
$topic_by_name = $result["topic_by_name"];
$comment_by_name = $result["comment_by_name"];
$comment_date = $result["board_comment_date"];
$count_comment = $result["count_comment"];
//ตัวแปรที่นำไปใช้งาน ในการแสดงผล
//$topic_id --> id ของกระทู้นั้น สำหรับทำ Link
//$topic_title --> หัวข้อของกระทู้นั้น
//$topic_date --> ตั้งกระทู้เมื่อ??
//$topic_by_name --> ตั้งกระทู้โดย
//$comment_by_name --> คอมเม้นล่าสุดโดย
//$count_comment --> จำนวนคอมเม้น
//$comment_date --> คอมเม้นล่าสุดเมื่อไหร่
}
คำสั่ง SQL ดูง่ายๆได้แบบนี้ครับ
SELECT
board_topic_id ,
board_topic_title ,
board_topic_date ,
member_name AS topic_by_name,
(
SELECT member_name FROM tb_comment
INNER JOIN tb_member ON member_id=board_comment_by
WHERE board_topic=board_topic_id
ORDER BY board_comment_date DESC LIMIT 0,1
) AS comment_by_name ,
(
SELECT board_comment_date FROM tb_comment
INNER JOIN tb_member ON member_id=board_comment_by
WHERE board_topic=board_topic_id
ORDER BY board_comment_date DESC LIMIT 0,1
) AS comment_date ,
(
SELECT count(*) FROM tb_comment
WHERE board_topic=board_topic_id
) AS count_comment
FROM tb_topic INNER JOIN tb_member ON board_topic_by=member_id
query กันซะเหนื่อยเลย
แต่การ query แล้วได้ผลลัพธ์ ตามต้องการ ทำได้แค่การ query 1 ครั้งเท่านั้น !!
ซึ่งจริงๆแล้วผมไม่แน่ใจว่า คำสั่ง query แบบที่ 3 นี้สามารถย่อให้ดีกว่านี้ได้หรือไม่นะครับ ถ้าใครมีคำแนะนำก็บอกได้ครับ
มาเข้าเรื่องจากคำถามที่ตั้งไว้ดีกว่าครับ
จาก 3 วิธี ที่เสนอมานี้
วิธีไหน จะ query มีประสิทธิภาพ และเร็วมากที่สุดครับ
ซึ่งผมเชื่อว่า ถ้ามองเผินๆ น่าจะเป็นวิธีที่ 3 อยู่แล้ว
แต่ว่า การ SELECT ซ้อน SELECT นั้น จะสู้ SELECT แบบธรรมดา แต่หลายๆครั้ง ได้รึเปล่า
ถ้ามองในเรื่องการใช้งานจริงๆ เพื่อรองรับ จำนวนคนเยอะๆ ในเวลาเดียว , ประสิทธิภาพของเครื่อง serverฯลฯ
ปล. ถ้าวิธีที่ 3 มีประสิทธิภาพที่ดี จริง ไว้จะลองเขียนเป็นบทความ อีกทีครับ รวมถึง เทคนิคการ query บางอย่างที่เชื่อว่าหลายๆคนอาจมองข้ามไป เราสามารถย่อ คำสั่ง query ได้อีกเยอะ ไม่ให้ต้องทำงาน หลายคำสั่งTag : PHP, Ms Access, MySQL, Ms SQL Server 2005, Ms SQL Server 2008, Oracle, DB2, PostgreSQL
Date :
2012-02-17 13:44:56
By :
Likito
View :
17437
Reply :
12
ดูเผินๆผมว่าน่าจะเป็นวิธีที่ 3 อะนะ
เพราะถ้าเป็น วิธีที่ 1 นี่ server ตายแน่นอน
วิธีที่ 2 ก็ยังหนักไปอยู่ดี
แต่ถ้าคิดในอีกแง่
ถ้าเราใช้วิธีที่ 4 ล่ะ
คือ สร้าง view เอาไว้
แล้วเราก็ select จาก view ดาบเดียวเลย? แบบนี้จะเร็วกว่าไหม
กระทู้นี้น่าสนใจดีครับ เพราะผมก็สงสัยเหมือนกัน
Date :
2012-02-17 14:17:15
By :
iamatomix
ตอนผมเรียน ผมก็เรียนไอ้พวก Big O อะไรพวกนี้มานะ
ผมว่า query ทีเดียวน่าจะดีสุดมั้ง -..-
มั้งนะ แต่มันก็แล้วแต่ กรณีไปด้วยละมั้ง
อย่างเวลาผมทำ ผมไม่ค่อยทำตามตำรา ที่ต้องเก็บ แต่ id ซะเท่าไหร่
ผมชอบออกแบบ db แบบของตัวเอง อันไหนใช้ก็ยัดรวมๆไว้เลย แต่มันจะ งงๆ ตอนเก็บค่านิดหน่อย
Date :
2012-02-17 14:33:46
By :
13eachz
ตอนนี้ไทยครีเอทก็เจอปัญหานี้อยู่ครับ เมื่อก่อนก็ Loop แล้วค่อย Query ทีล่ะตัวครับ ตอนนี้ใช้วิธี Query ครั้งเดียวแล้วค่อยแสดงผลครับ
Date :
2012-02-17 14:41:19
By :
webmaster
ขอแสดงความคิดเห็นครับ.....
โดยทั่วไปคนจะนึกถึงผลลัพธ์ที่ได้มากกว่าวิธีการที่จะได้มา เพราะฉะนั้น ผมคิดว่า มือใหม่ทั่วไปก็จะทำเท่าที่ตนเองเข้าใจแค่นั้นครับ... แต่ถ้ายังดำเนินงานในสายงานนี้ไปเรื่อยๆก็ต้องเพิ่มพูนประสปการณ์และอัพเดตตัวเองไปเรื่อยๆ
ถ้าเราสามารถ Optimize ระบบได้จะเป็นการดีมากๆ (ทั้งระบบนะครับ ไม่เฉพาะคิวรี่) เนื่องจากเจ้าของกระทู้เปิดประเด็นเรื่องคิวรี่เท่านั้น ผมก็ขอแสดงความเห็นว่า ไม่ว่าจะใช้การคิวรี่แบบไหนก็มีข้อดีข้อเสียแตกต่างกัน ทั้งนี้ขึ้นอยู่กับขนาดของระบบที่เรากำลังทำอยู่ รวมทั้งขนาดของระบบในอนาคตที่มันอาจจะเป็น
ในระบบที่ไม่ใหญ่โตมากนัก การคิวรี่ทั้งสามวิธีนั้นอาจจะไม่ค่อยเห็นผลสักเท่าไหร่ แต่ถ้ามีจำนวน row มากขึ้นก็จะทำให้เรารู้สึกได้ถึงความแตกต่าง
ประเด็นแรก ถ้าเราต้องการจำกัดจำนวนคิวรี่ให้น้อยลง แต่ระบบจะคิวรี่นานขึ้น ใช้เวลานานกว่าจะเสร็จ เพราะฉะนั้นน่าจะเหมาะกับระบบที่มีการ access เข้ามาในระบบที่ไม่มากนัก ยกตัวอย่างระบบที่มีการประมวลผลรายงาน โดยเฉพาะรายงานประจำปี เดือน หรือไตรมาส ที่มีการ summary เยอะๆ ระบบแบบนี้มักจะมีฐานข้อมูลสำรองที่เอาไว้สำหรับคิวรี่โดยเฉพาะ แยกออกมาจากฐานข้อมูลหลักเลย
ประเด็นที่สอง การคิวรี่บ่อยครั้งขึ้น แต่เป็นคิวรี่เล็กๆน้อยๆ หมายความว่าคิวรี่เล็กๆนั้นต้องเล็กจริงๆนะครับ เพราะบางครั้งคิวรี่เล็กๆอันเดียวแต่กว่าจะสำเร็จอาจจะนานก็ได้ ซึ่งมันก็จะไม่ค่อยเหมาะสมนักกับการซอยคิวรี่ออกเยอะๆ
เพราะฉะนั้นการเลือกวิธีการต้องดูเหตุผลในการใช้งาน ประกอบกับจำนวน connection ที่จะเกิดขึ้น ตลอดจน อัลกอริทึมที่ใช้ในการ process ในแต่ละครั้งว่าซับซ้อนแค่ไหนด้วยครับ
Date :
2012-02-17 14:43:30
By :
Songkram
ขอบคุณทุกความเห็นเลยครับ
ผมเคยทำระบบ คำนวณ ผลประเมินการสอน
แรกๆก็ออกแบบระบบตามที่เคยเรียนเลย
คนประเมิน 1 คน มีคำถาม 20 ข้อ ก็เก็บ ข้อมูลประเมิน 20 record
เพราะหวังว่าในอนาคต เกิดมีข้อคำถามเปลี่ยนแปลง เพิ่มลดจำนวน จะได้ dynamic ง่ายๆ
พอถึงเวลาใช้งานจริงๆ ตอนจะคำนวณ
select กระจาย join นรก loop มหากาฬ
สุดท้ายต้องออกแบบให้ 1 record เก็บ ผลประเมินมันเลย 20 ข้อ
บางอย่างตามตำรา มันก็ใช้ไม่ได้จริงๆ
ว่าแต่ การ คำนวณ ในคำสั่ง SELECT เลย
เช่น SELECT AVG(field_1) / SUM(field_2) AS result_calculate FROM table
แบบนี้
กับการ SELECT เป็นแค่ field ๆไป แล้วใช้ php เป็นตัวคำนวณ แบบไหนมันจะดีกว่าหว่า
ยิ่งถามยิ่งคุย ยิ่งเกิดคำถาม
Date :
2012-02-17 15:03:26
By :
Likito
Code (PHP)
SELECT AVG(field_1) / SUM(field_2) AS result_calculate FROM table
แบบด้านบนนี้จะใช้ความสามารถของ mysql ในการทำงาน เพราะฉะนั้นมันก็จะมีผลกระทบกับฐานข้อมูลโดยตรง ภาระงานจะอยู่ที่ mysql เหมาะกับระบบที่มีการ connection น้อยๆ แต่ก็อีกนั่นแหละ ระบบที่ไม่ใหญ่โตนักก็จะไม่ค่อยเห็นผลสักเท่าไหร่
ส่วนการ SELECT เป็นแค่ field ๆไป แล้วใช้ php เป็นตัวคำนวณ จะมีผลกระทบกับเครื่องที่เป็นตัวรัน PHP ภาระงานจะตกไปอยู่ที่ web service
ในความเป็นจริงเราควรจะแยกเครื่องที่ใช้เป็นตัว web service กับ Database เพื่อให้สามารถรองรับการทำงานแยกกัน (ระบบใหญ่ๆควรจะเป็นเช่นนี้) ซึ่งจะทำให้ CPU ของเครื่องใช้งานได้อย่างเต็มประสิทธิภาพมากกว่า
และก็ในความเป็นจริงเหมือนกันคือ ส่วนใหญ่จะมี web service กับ Database อยู่เครื่องเดียวกัน ทำให้ภาระงานหลักตกไปอยู่ที่ CPU ของเครื่องที่ใช้เป็น Server นั่นเอง
Date :
2012-02-17 15:18:51
By :
Songkram
ข้อแสดงความคิดเห็นนะครับ........
ก่อนอื่นต้องบอกก่อนว่า ผมเองก็เขียน php ไม่เป็นและก็ไม่เคยใช้ mysql ผมเคยใช้แต่ oracle
พอดีมีเพื่อน ทวิตเตอร์ถามมาว่า คิดเห็นอย่างไร
ผมเองมีความคิดว่าถ้า join 3 ตารางแล้วใช้ group function ทีเดียวเลยจะง่ายกว่าหรือเปล่า (อันนี้เป็นความคิดเห็นส่วนตัวน่ะครับ)
select หัวเรื่องของกระทู้ , ผู้ตั้งกระทู้ , ตั้งกระทู้เมื่อเวลา ,count(จำนวนคนที่ตอบกระทู้) , ผู้ตอบกระทู้ล่าสุด ,max(ตอบกระทู้ล่าสุดเมื่อเวลา)
แล้ว group by ข้อมูล หัวเรื่องของกระทู้ , ผู้ตั้งกระทู้ , ตั้งกระทู้เมื่อเวลา , ผู้ตอบกระทู้ล่าสุด
แต่ผมเองก็ยังไม่ได้ลองเนื่องจากไม่มีข้อมูลให้ลอง เลยไม่แน่ใจว่าผลที่ได้จะเป็นแบบที่ต้องการหรือไม่
ผิดพลาดประการใดขออภัยมา ณ ที่นี้ ด้วยนะครับ
Date :
2012-02-17 15:52:35
By :
ballppd
ถ้าไม่ได้กล่าวถึงการออกแบบฐานข้อมูลแต่แรกแล้วคงเลือกที่จะ query เพียงครั้งเดียวแต่จะไม่ให้เกิดการ คำนวนหรือให้เกิดการคำนวนน้อยที่สุด เพราะการที่เชื่อมต่อฐานข้อมูลนั้นทำให้ข้อมูลนั้นช้ากว่าถ้าทำใน PHP (คิดว่านะ)
วนๆหลายๆรอบไม่แน่ใจแต่เคยมีเพื่อนทำแล้วบอกว่าวนสองรอบนั้นเร็วกว่าอยู่นิดหน่อย แต่ไม่ได้ฟังนะว่ากี่ row แต่ยังไงแล้วส่วนตัวคิดต้องมีพื้นฐานจากการออกแบบ Table ที่ดีมาก่อนว่าอันนี้มีการเข้าถึงข้อมูลเยอะหรือน้อยจะได้แยกมาให้คำนวนต่างหากเลยครับ
แต่ในกรณีของกระทู้นี้ก็ยังคิดว่า Query ออกมาในคิวรี่เดียวครับ
Date :
2012-02-17 16:18:16
By :
oxygenyoyo
SELECT board_topic_id, board_topic_title, board_topic_date, member_name AS topic_by_name,
member_name AS comment_by_name,
board_comment_date AS comment_date, count(*) AS count_comment
FROM tb_topic
join tb_comment on(board_topic=board_topic_id)
join tb_member on(member_id=board_comment_by)
group by board_topic_id, board_topic_title, board_topic_date, member_name,
member_name, board_comment_date
Date :
2018-06-04 10:25:27
By :
KA
วิธีที่ 3 ก็ยังไม่ใช่วิธีที่ดีที่สุดครับ
ปัญหาคือ subquery ใน select
การที่มี subquery ใน select จะมีผลให้เกิด query ย่อยๆ ตามจำนวนแถวของผลลัพท์ เช่น ผลลัพท์จำนวน 100 แถว จะเกิด query ย่อย เพิ่มอีก 100 ครั้ง ที่ MySQL
วิธีที่ดีกว่าคือใช้การ JOIN ครับ เนื่องจากข้อมูลที่นำมา JOIN จะเกิดเพียงรอบเดียว (ตอนที่ JOIN) การ select จะนำข้อมูลที่ได้จากการ join แล้ว ออกมาใช้ได้เลย
SELECT A.topic, B.comment,C.name
FROM question AS A
INNER JOIN answer AS B ON B.question_id=A.id
INNER JOIN user AS C ON U.id=A.member_id
LIMIT 100
ประวัติการแก้ไข 2018-06-06 08:03:45
Date :
2018-06-06 08:01:13
By :
goragod
Load balance : Server 03