มีข้อมูลในดาต้าเบสเยอะมากๆ ประมาณ 1 แสน record ได้ครับ แต่ละ record มีชื่อฟิลล์ id, title, detail
ผมอยากจะดึงข้อมูลมาโชว์หน้าละ 100 record จะเขียนโค๊ตยังไงให้ดึุงข้อมูลได้เร็วครับ เพราะตอนนี้ใช้ limit 0, 100
แต่มันค่อยข้างช้า มีวิธีอื่นแนะนำไหมครับ ขอบคุณครับ
พอจะมีวิธีไหมครับ หาข้อมูลในเน็ต ยังไม่ค่อยเข้าใจเท่าไร
Basic ครับอันนี้ ลองหัดทำดูก่อน แล้วนำไปประยุกต์ต่อครับ ผมเองก็ยังไม่เก่ง
http://www.expert2you.com/view_article.php?art_id=15
อันนี้เปรียบเทียบให้เห็นความเร็วครับ
icez
6
[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:
icez
8
[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)