Query ข้อมูลเยอะ ยังไงให้เร็วครับ

มีข้อมูลในดาต้าเบสเยอะมากๆ ประมาณ 1 แสน record ได้ครับ แต่ละ record มีชื่อฟิลล์ id, title, detail

ผมอยากจะดึงข้อมูลมาโชว์หน้าละ 100 record จะเขียนโค๊ตยังไงให้ดึุงข้อมูลได้เร็วครับ เพราะตอนนี้ใช้ limit 0, 100

แต่มันค่อยข้างช้า มีวิธีอื่นแนะนำไหมครับ ขอบคุณครับ

ลองทำ index หรือยังครับ

พอจะมีวิธีไหมครับ หาข้อมูลในเน็ต ยังไม่ค่อยเข้าใจเท่าไร

Basic ครับอันนี้ ลองหัดทำดูก่อน แล้วนำไปประยุกต์ต่อครับ ผมเองก็ยังไม่เก่ง
http://www.expert2you.com/view_article.php?art_id=15

อันนี้เปรียบเทียบให้เห็นความเร็วครับ

ลองคิดตอน Query นะครับ

  1. ต้อง SELECT * FROM <table>

[quote author=siambox.com link=topic=16841.msg157789#msg157789 date=1232114753]
ลองคิดตอน Query นะครับ

1. ต้อง SELECT * FROM <table> ก่อน 1 ครั้ง เพื่อนนำ rows ทั่งหมด
2. คำนวนว่าตอนนี้อยู่ที่หน้าเท่าไหร่แล้ว ถ้าไม่มีการ set ค่า page ให้ $page = 1;
3. คำนวนหา start record
4. SELECT * FROM <table> LIMIT 0, 100

สิ่งที่ สามารถช่วยได้คือ ตอน SELECT * FROM <table> ผมจะใช้ memcache ทำการ cache ตรงนี้ไว้ ครับ

อีกเรื่องก็ เรื่อง Index ครับ ลองเอา Query นั้นๆ ไปทดสอบโดยใช้คำสั่ง EXPLAIN <SQL> มันจะบอกว่า มันใช้ Index หรือไม่

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

http://www.icez.net/blog/25/0021-วิธีนับจำนวนแถว-record-ในตาร

ปล. แอบเนียน

ถ้าเป็นผมเองนะครับ

SELECT * ได้ครับ ถ้า Field ใน table นั้นน้อยๆ หรือ ได้รับการ Limit แล้ว

แต่ในกรณีที่ต้องการ Optimize ก็ไม่ควรครับ

การทำให้เร็วนั้น ทำได้หลายวิธี นะครับ ง่ายที่สุดคือ INDEX

หลักการทำ INDEX คือ WHERE อะไร ให้ ทำ index ตามนั้น

เช่น WHERE id = ‘??’ ก็ให้ทำ id เป็น index
WHERE username = ‘??’ AND password = ‘??’ ก็ทำ index เป็นขนาด 2 ตัว คือ username, password

มีกี่ตัวทำตามนั้นครับ ไม่ต้องกลัวเปลือง mem ถ้าอยากได้เร็วๆ (เครื่องต้อง supprt พอด้วยนะ)

ฉนั้นการปรับ WHERE COURSE ดีๆ จะทำให้เร็วได้ครับ :wub:

[quote author=obiconbig link=topic=16841.msg157805#msg157805 date=1232120410]
ถ้าเป็นผมเองนะครับ

SELECT * ได้ครับ ถ้า Field ใน table นั้นน้อยๆ หรือ ได้รับการ Limit แล้ว

แต่ในกรณีที่ต้องการ Optimize ก็ไม่ควรครับ

การทำให้เร็วนั้น ทำได้หลายวิธี นะครับ ง่ายที่สุดคือ INDEX

หลักการทำ INDEX คือ WHERE อะไร ให้ ทำ index ตามนั้น

เช่น WHERE id = ‘??’ ก็ให้ทำ id เป็น index
WHERE username = ‘??’ AND password = ‘??’ ก็ทำ index เป็นขนาด 2 ตัว คือ username, password

มีกี่ตัวทำตามนั้นครับ ไม่ต้องกลัวเปลือง mem ถ้าอยากได้เร็วๆ (เครื่องต้อง supprt พอด้วยนะ)

ฉนั้นการปรับ WHERE COURSE ดีๆ จะทำให้เร็วได้ครับ :wub:
[/quote]ไม่เผื่อ scale ระบบหน่อยหรอครับ lol
กรณีที่ต้องมีการแบ่งหน้านี่ หมายความว่ามีข้อมูลเยอะซะจนไม่สามารถยัดลงหน้าเดียวได้หมดแล้วมั้ง
แล้วอย่างที่อธิบายไปใน blog ครับ

“สมมติว่า ตารางมีขนาด 1 MB
การ query นี้จะทำให้ mysql ต้องส่งข้อมูลขนาด 1 MB ให้ client ที่ทำการ query
แล้ว client จะเป็นผู้นับจำนวนแถวเอง
ลองคิดดูว่าถ้าตารางเราเกิดมีขนาด 10 MB หรือมีคนเข้าเยอะๆ นะครับ
สมมติ ตารางเดิม ขนาด 1 MB
แต่คนเข้า “แค่” นาทีละ 60 ครั้ง (ตกวินาทีละ 1 ครั้ง)
เท่ากับ Database Server ต้องส่งข้อมูลให้ client ถึงวินาทีละ 1 MB

(นี่ขนาดตารางแค่ 1 MB นะครับ ตารางเล็กกะตึ๋งนึง)

การนับจำนวนแถว ไม่ควรใช้ SELECT * ไม่ว่ากรณีใดๆ ทั้งสิ้น
เปลือง process และ i/o throughput มหาศาล

ส่วนเรื่อง index … ถ้าไม่มีใช้ where ก็ไม่ต้องทำครับ
แต่ถ้ามี query ไหนใช้ก็ทำใส่ไปตามนั้นแหละ ^^" (ระวังอย่าทำซ้ำ field เดิมนะครับ เปลือง ram)

+1 to icez

[move to Technical]