Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > PHP > PHP Forum > ถามเรื่องประสิทธิภาพการ query คำสั่ง SQL ครับ อยากทราบว่าแบบไหนจะมีประสิทธิภาพมาก และเร็วกว่ากันครับ



 

ถามเรื่องประสิทธิภาพการ query คำสั่ง SQL ครับ อยากทราบว่าแบบไหนจะมีประสิทธิภาพมาก และเร็วกว่ากันครับ

 



Topic : 074032



โพสกระทู้ ( 335 )
บทความ ( 0 )



สถานะออฟไลน์




การ 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







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2012-02-17 13:44:56 By : Likito View : 17236 Reply : 12
 

 

No. 1



โพสกระทู้ ( 479 )
บทความ ( 0 )



สถานะออฟไลน์
Twitter Facebook Hi5

ดูเผินๆผมว่าน่าจะเป็นวิธีที่ 3 อะนะ
เพราะถ้าเป็น วิธีที่ 1 นี่ server ตายแน่นอน
วิธีที่ 2 ก็ยังหนักไปอยู่ดี

แต่ถ้าคิดในอีกแง่
ถ้าเราใช้วิธีที่ 4 ล่ะ
คือ สร้าง view เอาไว้
แล้วเราก็ select จาก view ดาบเดียวเลย? แบบนี้จะเร็วกว่าไหม

กระทู้นี้น่าสนใจดีครับ เพราะผมก็สงสัยเหมือนกัน






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-02-17 14:17:15 By : iamatomix
 


 

No. 2



โพสกระทู้ ( 144 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตอนผมเรียน ผมก็เรียนไอ้พวก Big O อะไรพวกนี้มานะ

ผมว่า query ทีเดียวน่าจะดีสุดมั้ง -..-

มั้งนะ แต่มันก็แล้วแต่ กรณีไปด้วยละมั้ง
อย่างเวลาผมทำ ผมไม่ค่อยทำตามตำรา ที่ต้องเก็บ แต่ id ซะเท่าไหร่
ผมชอบออกแบบ db แบบของตัวเอง อันไหนใช้ก็ยัดรวมๆไว้เลย แต่มันจะ งงๆ ตอนเก็บค่านิดหน่อย
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-02-17 14:33:46 By : 13eachz
 

 

No. 3



โพสกระทู้ ( 479 )
บทความ ( 0 )



สถานะออฟไลน์
Twitter Facebook Hi5

ไปเจออันนี้มาครับ
http://www.myblog.in.th/2008/05/15/mysql-join-table-effect/
Via @jirayu
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-02-17 14:38:51 By : iamatomix
 


 

No. 4



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

ตอนนี้ไทยครีเอทก็เจอปัญหานี้อยู่ครับ เมื่อก่อนก็ Loop แล้วค่อย Query ทีล่ะตัวครับ ตอนนี้ใช้วิธี Query ครั้งเดียวแล้วค่อยแสดงผลครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-02-17 14:41:19 By : webmaster
 


 

No. 5



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


ขอแสดงความคิดเห็นครับ.....

โดยทั่วไปคนจะนึกถึงผลลัพธ์ที่ได้มากกว่าวิธีการที่จะได้มา เพราะฉะนั้น ผมคิดว่า มือใหม่ทั่วไปก็จะทำเท่าที่ตนเองเข้าใจแค่นั้นครับ... แต่ถ้ายังดำเนินงานในสายงานนี้ไปเรื่อยๆก็ต้องเพิ่มพูนประสปการณ์และอัพเดตตัวเองไปเรื่อยๆ

ถ้าเราสามารถ Optimize ระบบได้จะเป็นการดีมากๆ (ทั้งระบบนะครับ ไม่เฉพาะคิวรี่) เนื่องจากเจ้าของกระทู้เปิดประเด็นเรื่องคิวรี่เท่านั้น ผมก็ขอแสดงความเห็นว่า ไม่ว่าจะใช้การคิวรี่แบบไหนก็มีข้อดีข้อเสียแตกต่างกัน ทั้งนี้ขึ้นอยู่กับขนาดของระบบที่เรากำลังทำอยู่ รวมทั้งขนาดของระบบในอนาคตที่มันอาจจะเป็น

ในระบบที่ไม่ใหญ่โตมากนัก การคิวรี่ทั้งสามวิธีนั้นอาจจะไม่ค่อยเห็นผลสักเท่าไหร่ แต่ถ้ามีจำนวน row มากขึ้นก็จะทำให้เรารู้สึกได้ถึงความแตกต่าง

ประเด็นแรก ถ้าเราต้องการจำกัดจำนวนคิวรี่ให้น้อยลง แต่ระบบจะคิวรี่นานขึ้น ใช้เวลานานกว่าจะเสร็จ เพราะฉะนั้นน่าจะเหมาะกับระบบที่มีการ access เข้ามาในระบบที่ไม่มากนัก ยกตัวอย่างระบบที่มีการประมวลผลรายงาน โดยเฉพาะรายงานประจำปี เดือน หรือไตรมาส ที่มีการ summary เยอะๆ ระบบแบบนี้มักจะมีฐานข้อมูลสำรองที่เอาไว้สำหรับคิวรี่โดยเฉพาะ แยกออกมาจากฐานข้อมูลหลักเลย

ประเด็นที่สอง การคิวรี่บ่อยครั้งขึ้น แต่เป็นคิวรี่เล็กๆน้อยๆ หมายความว่าคิวรี่เล็กๆนั้นต้องเล็กจริงๆนะครับ เพราะบางครั้งคิวรี่เล็กๆอันเดียวแต่กว่าจะสำเร็จอาจจะนานก็ได้ ซึ่งมันก็จะไม่ค่อยเหมาะสมนักกับการซอยคิวรี่ออกเยอะๆ

เพราะฉะนั้นการเลือกวิธีการต้องดูเหตุผลในการใช้งาน ประกอบกับจำนวน connection ที่จะเกิดขึ้น ตลอดจน อัลกอริทึมที่ใช้ในการ process ในแต่ละครั้งว่าซับซ้อนแค่ไหนด้วยครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-02-17 14:43:30 By : Songkram
 


 

No. 6



โพสกระทู้ ( 335 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบคุณทุกความเห็นเลยครับ

ผมเคยทำระบบ คำนวณ ผลประเมินการสอน
แรกๆก็ออกแบบระบบตามที่เคยเรียนเลย
คนประเมิน 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
 


 

No. 7



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


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
 


 

No. 8



โพสกระทู้ ( 4 )
บทความ ( 0 )



สถานะออฟไลน์


ข้อแสดงความคิดเห็นนะครับ........

ก่อนอื่นต้องบอกก่อนว่า ผมเองก็เขียน php ไม่เป็นและก็ไม่เคยใช้ mysql ผมเคยใช้แต่ oracle

พอดีมีเพื่อน ทวิตเตอร์ถามมาว่า คิดเห็นอย่างไร

ผมเองมีความคิดว่าถ้า join 3 ตารางแล้วใช้ group function ทีเดียวเลยจะง่ายกว่าหรือเปล่า (อันนี้เป็นความคิดเห็นส่วนตัวน่ะครับ)


select หัวเรื่องของกระทู้ , ผู้ตั้งกระทู้ , ตั้งกระทู้เมื่อเวลา ,count(จำนวนคนที่ตอบกระทู้) , ผู้ตอบกระทู้ล่าสุด ,max(ตอบกระทู้ล่าสุดเมื่อเวลา)

แล้ว group by ข้อมูล หัวเรื่องของกระทู้ , ผู้ตั้งกระทู้ , ตั้งกระทู้เมื่อเวลา , ผู้ตอบกระทู้ล่าสุด


แต่ผมเองก็ยังไม่ได้ลองเนื่องจากไม่มีข้อมูลให้ลอง เลยไม่แน่ใจว่าผลที่ได้จะเป็นแบบที่ต้องการหรือไม่

ผิดพลาดประการใดขออภัยมา ณ ที่นี้ ด้วยนะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-02-17 15:52:35 By : ballppd
 


 

No. 9



โพสกระทู้ ( 599 )
บทความ ( 0 )



สถานะออฟไลน์
Twitter Facebook

ถ้าไม่ได้กล่าวถึงการออกแบบฐานข้อมูลแต่แรกแล้วคงเลือกที่จะ query เพียงครั้งเดียวแต่จะไม่ให้เกิดการ คำนวนหรือให้เกิดการคำนวนน้อยที่สุด เพราะการที่เชื่อมต่อฐานข้อมูลนั้นทำให้ข้อมูลนั้นช้ากว่าถ้าทำใน PHP (คิดว่านะ)

วนๆหลายๆรอบไม่แน่ใจแต่เคยมีเพื่อนทำแล้วบอกว่าวนสองรอบนั้นเร็วกว่าอยู่นิดหน่อย แต่ไม่ได้ฟังนะว่ากี่ row แต่ยังไงแล้วส่วนตัวคิดต้องมีพื้นฐานจากการออกแบบ Table ที่ดีมาก่อนว่าอันนี้มีการเข้าถึงข้อมูลเยอะหรือน้อยจะได้แยกมาให้คำนวนต่างหากเลยครับ

แต่ในกรณีของกระทู้นี้ก็ยังคิดว่า Query ออกมาในคิวรี่เดียวครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-02-17 16:18:16 By : oxygenyoyo
 


 

No. 10



โพสกระทู้ ( 74 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 4 เขียนโดย : webmaster เมื่อวันที่ 2012-02-17 14:41:19
รายละเอียดของการตอบ ::
ไม่ทราบว่าตอนนี้ Thaicreate มีปัญหาอยู่อีกรึเปล่า ... เพราะหนูเริ่มมีปัญหาแล้วค่ะ



ประวัติการแก้ไข
2014-05-12 11:28:33
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-05-12 11:28:07 By : kullasom
 


 

No. 11

Guest


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
 


 

No. 12



โพสกระทู้ ( 411 )
บทความ ( 0 )



สถานะออฟไลน์


วิธีที่ 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
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ถามเรื่องประสิทธิภาพการ query คำสั่ง SQL ครับ อยากทราบว่าแบบไหนจะมีประสิทธิภาพมาก และเร็วกว่ากันครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่