Site icon บริษัท โค๊ดบี จำกัด

วิธีทำ Website / MySQL ให้โหลดโคตรเร็วและรองรับคนปริมาณมาก ๆ

วิธีทำ-Website-MySQL-ให้โหลดโคตรเร็ว-2

วิธีทำ-Website-MySQL-ให้โหลดโคตรเร็ว-2

<h3>วิธีทำ Website &sol; MySQL ให้โหลดโคตรเร็วและรองรับคนปริมาณมาก ๆ<&sol;h3>&NewLine;<p><&sol;br><br &sol;>&NewLine;<strong>วิธีทำ Website &sol; MySQL ให้โหลดโคตรเร็วและรองรับคนปริมาณมาก ๆ<&sol;strong><&sol;p>&NewLine;<p>ถ้าโจทย์คือการทำเว็บไซต์ ขายสินค้าออนไลน์ ที่มีสินค้ารวมทั้งหมดเป็นแสนรายการ และในหน้าแสดงรายการสินค้า ให้แสดงรายการสินค้า 1&comma;000 ชิ้นต่อ 1 หน้า ในหน้ารายการสินค้า ต้องรองรับคนเข้าชมพร้อม ๆ กัน 1 หมื่นคน ขอย้ำว่า เข้าชมพร้อม ๆ กัน 1 หมื่นคน ไม่ไช่การทยอยเข้าชมนะครับ <&excl;--more--><&sol;p>&NewLine;<p>คำถามคือการเข้าชมแบบพร้อม ๆ กันหลักหมื่นคน จะเกิดขึ้นได้ยังไง จากที่เคยเจอคือ เกิดจากการปล่อย push notification และ จากการแชร์ลงไปใน pages หรือ group facebook ที่มีสมาชิกจำนวนมาก ๆ เพราะฉะนั้น กรณีเกิดขึ้นได้แน่นอนครับ<br &sol;>&NewLine;<&sol;br><&sol;p>&NewLine;<h4>แนวทางการทำให้ website และ database รองรับคนปริมาณมาก ๆ<&sol;h4>&NewLine;<p>ทุกข้อตามด้านล่าง ถ้าทำแล้วจะเห็นผลชัดเจนทุกข้อ <strong>โดยเฉพาะ ข้อ 4 และข้อ 5<&sol;strong> จะทำให้การโหลดหน้าเพจเร็วขึ้นหลายสิบเท่าตัวครับ สามารถทดสอบได้โดยการติดตั้ง <a href&equals;"https&colon;&sol;&sol;chrome&period;google&period;com&sol;webstore&sol;detail&sol;page-load-time&sol;fploionmjgeclbkemipmkogoaohcdbig">chrome extension page load time<&sol;a> และดูเวลาที่ใช้ในการโหลดได้ครับ ถ้าทำครบทั้ง 5 ข้อ สามารถให้หน้าเว็บหนัก ๆ โหลดเร็วแบบไม่ถึงวินาทีได้เลย<br &sol;>&NewLine;<&sol;br><&sol;p>&NewLine;<ul>&NewLine;<li><strong>1&period; กำหนด max&lowbar;connection ให้เพียงพอกับการเข้าชมพร้อม ๆ กัน<&sol;strong><&sol;li>&NewLine;<p>โดยปกติค่าเริ่มต้นของ Hosting ทั่วไปจะกำหนดจำนวนการเชื่อมต่อฐานข้อมูลไว้ประมาณ 200 &&num;8211&semi; 300 concurrent connection หมายความว่า ถ้ามีคนเข้าเว็บไซต์เราพร้อม ๆ กัน 300 คน Database Error ทันทีครับ แต่ปกติแล้ว ถ้าเว็บไซต์ที่ไม่ได้มี traffic มากมายอะไร โอกาสที่จะเกิดขึ้นน้อยมาก เพราะโดยส่วนใหญ่แล้ว การเชื่อมต่อจะเป็นในลักษณะ เชื่อมต่อ โหลดข้อมูลเสร็จ แล้วก็ปิดการเชื่อมต่อ ทำให้มี connection ว่างสำหรับคนเข้าชมต่อ ๆ ไป แต่ถ้าโจทย์ของเราคือการ รองรับการเข้าชมพร้อม ๆ กัน 1 หมื่นคน ให้กำหนด max&lowbar;connection เกินหมื่นคนขึ้นไปครับ<br &sol;>&NewLine;สามารถดูตัวเลข max&lowbar;connection ได้ที่ phpMyAdmin&sol;Variables&sol;max&lowbar;connection หรือใช้คำสั่งคิวรี่ด้านล่างครับ<&sol;p>&NewLine;<pre class&equals;"lang&colon;default decode&colon;true " >show variables like "max&lowbar;connections"&semi;<&sol;pre>&NewLine;<p><&sol;br><&sol;p>&NewLine;<li><strong>2&period; Query ให้น้อยที่สุดและ Query มาใช้เฉพาะที่ต้องใช้<&sol;strong><&sol;li>&NewLine;<p>ลดการ select ข้อมูลใน 1 หน้าให้น้อยที่สุดเท่าที่จะทำได้ select ข้อมูลเท่าที่จำเป็นเท่านั้น หลีกเลี่ยงการใช้ select &ast; เพื่อลดปริมาณการ query การนับจำนวน record ให้ใช้การเพิ่ม field แทนการใช้ select และ count&lpar;array&rpar; ตัวอย่างเช่น ถ้าเราต้องการแสดงตัวเลขจำนวนสินค้าในหมวดหมู่ไอที แทนที่จะใช้วิธีนี้<&sol;p>&NewLine;<pre class&equals;"lang&colon;default decode&colon;true " >&dollar;result &equals; &dollar;this-&gt&semi;db-&gt&semi;query&lpar;"select &ast; from product where product&lowbar;type &equals; 1"&rpar;&semi; &NewLine;&dollar;maxItproduct &equals; count&lpar;&dollar;result&rpar;&semi;<&sol;pre>&NewLine;<p>ให้เปลี่ยนเป็นการเพิ่ม field max&lowbar;item ใน table product&lowbar;type แทน เพื่อลดการ query การ loop หาจำนวนสินค้าในหมวดหมู่นั้น ๆ<br &sol;>&NewLine;<&sol;br><&sol;p>&NewLine;<li><strong>3&period; ใช้ loop ในหนึ่งหน้าให้น้อยที่สุด<&sol;strong><&sol;li>&NewLine;<p>แน่นอนครับว่าการใช้ loop นั้นมีผลโดยตรงกับการประมวลผลโดยรวมของหน้าเว็บไซต์ ยิ่งปริมาณไอเทมที่ loop มากเท่าไหร่ และภายใน loop นั้นมีการคำนวณ การประมวลผลที่ซับซ้อนมากเท่าไหร่ จะยิ่งทำให้การโหลดหน้าเว็บไซต์ใช้เวลามากขึ้นเท่านั้น ให้หลีกเลี่ยงการใช้ loop ซ้อนอยู่ภายใน loop การ query ข้อมูลภายใน loop วิธีการหลีกเลี่ยงที่ดีที่สุด ก็คือการออกแบบฐานข้อมูลให้พร้อมนำมาใช้งานมากที่สุด<br &sol;>&NewLine;<&sol;br><&sol;p>&NewLine;<li><strong>4&period; ต้องทำ Database Caching<&sol;strong><&sol;li>&NewLine;<p>การทำ db caching นั้นจะลดการประมวลผลของหน้าเว็บไซต์และทำให้การโหลดหน้าเว็บไซต์เร็วขึ้นมาก มากแบบหลายเท่าตัว จากปกติเว็บไซต์เราอาจจะใช้เวลาโหลด 5&period;20 วินาที การทำ db caching อาจจะทำให้หน้าเว็บใช้เวลาโหลดลดลงเหลือเพียง 0&period;20 วินาทีเท่านั้น<br &sol;>&NewLine;เว็บไซต์แบบ dynamic content หมายถึงเว็บไซต์ที่มีการปรับปรุงเปลี่ยนแปลงข้อมูลบนหน้าเว็บไซต์เป็นประจำ กล่าวคือการดึงข้อมูลจาก database มาแสดงผลบนหน้าเว็บไซต์ การทำ db caching คือการดึงข้อมูลมาแสดงเพียงครั้งแรกครั้งเดียว และครั้งต่อ ๆ ไปเป็นการใช้ cache ข้อมูล จนกว่าจะครบกำหนดเวลาค่อยไปถึงข้อมูลมา update เป็น cache อีกครั้ง ซึ่งการกำหนดช่วงเวลาของการอัพเดทก็จะขึ้นอยู่กับว่าข้อมูลนั้นมีความจำเป็นจะต้องอัพเดทบ่อยขนาดไหน อาจจะอัพเดททุก 30 นาที 1 วัน หรือ 1 เดือนเป็นต้น ตัวอย่างการทำ cache db ใน codeigniter<&sol;p>&NewLine;<pre class&equals;"lang&colon;default decode&colon;true " >&sol;&sol; เปิดการเก็บ cache สำหรับเทเบิ้ล product เพราะสินค้ามีปริมาณมาก &NewLine;&dollar;this-&gt&semi;db-&gt&semi;cache&lowbar;on&lpar;&rpar;&semi; &NewLine;&dollar;query &equals; &dollar;this-&gt&semi;db-&gt&semi;query&lpar;"SELECT &ast; FROM product"&rpar;&semi; &NewLine; &NewLine;&sol;&sol; ไม่เก็บ cache สำหรับสมาชิกที่กำลังออนไลน์อยู่ เพราะมีข้อมูลบางส่วนที่ต้องอัพเดทแบบ real time &NewLine;&dollar;this-&gt&semi;db-&gt&semi;cache&lowbar;off&lpar;&rpar;&semi; &NewLine;&dollar;query &equals; &dollar;this-&gt&semi;db-&gt&semi;query&lpar;"SELECT &ast; FROM members WHERE member&lowbar;id &equals; '&dollar;current&lowbar;user'"&rpar;&semi; &NewLine; &NewLine;&sol;&sol; เปิดการเก็บ cache สำหรับเทเบิ้ล category เพราะไม่มีการอัพเดทบ่อย ๆ อยู่แล้ว &NewLine;&dollar;this-&gt&semi;db-&gt&semi;cache&lowbar;on&lpar;&rpar;&semi; &NewLine;&dollar;query &equals; &dollar;this-&gt&semi;db-&gt&semi;query&lpar;"SELECT &ast; FROM category"&rpar;&semi;<&sol;pre>&NewLine;<p><&sol;br><&sol;p>&NewLine;<li><strong>5&period; ใช้ MyISAM และกำหนด Indexes<&sol;strong><&sol;li>&NewLine;<p>ฐานข้อมูลประเภท MyISAM มีจุดเด่นในเรื่องของความเร็วในการอ่านและการเขียนอยู่แล้ว ซึ่งเร็วกว่า InnoDB แน่นอนครับและยิ่งถ้าเราทำ indexes ให้กับทุก ๆ field ที่ต้อง where หาอยู่บ่อย จะยิ่งเพิ่มความเร็วในการ query มากหลายเท่าตัวครับ ยกตัวอย่างเช่น ในเทเบิ้ล category เราต้อง select และ where หา cate&lowbar;id อยู่บ่อย ๆ ทำไมไม่กำหนด indexes ให้ cate&lowbar;id ไปเลย จะได้หาง่ายขึ้น การทำ indexes ไม่ได้ทำที่ตอน query นะครับ ให้เข้าไปทำใน phpMyadmin เลย เลือกที่ more และ index<br &sol;>&NewLine;<&sol;br><&sol;p>&NewLine;<p><img src&equals;"https&colon;&sol;&sol;www&period;codebee&period;co&period;th&sol;labs&sol;wp-content&sol;uploads&sol;2017&sol;11&sol;วิธีทำ-Website-MySQL-ให้โหลดโคตรเร็ว-1&period;png" alt&equals;"วิธีทำ-Website-MySQL-ให้โหลดโคตรเร็ว-1&period;png" &sol;><br &sol;>&NewLine;<&sol;br><br &sol;>&NewLine;หรือใช้คำสั่ง SQL<&sol;p>&NewLine;<pre class&equals;"lang&colon;default decode&colon;true " >ALTER TABLE &grave;apps&lowbar;member&grave; ADD INDEX&lpar;&grave;member&lowbar;id&grave;&rpar;&semi;<&sol;pre>&NewLine;<&sol;ul>&NewLine;<p><&sol;br><br &sol;>&NewLine;ถ้าทำครบทั้ง 5 ข้อด้านบน เว็บไซต์จะโหลดเร็วขึ้นทันตาเห็นแน่นอนครับ หวังว่าจะเป็นประโยชน์<br &sol;>&NewLine;<&sol;br><&sol;p>&NewLine;

Exit mobile version