เทคนิคการเขียน PHP และ MYSQL แบบมีประสิทธิภาพ และทำงานได้ดีขึ้น

เทคนิคการเขียน PHP และ MYSQL แบบมีประสิทธิภาพ และทำงานได้ดีขึ้น

วันนี้ผมเอาเทคนิค การเขียนโปรแกรมภาษา PHP และ Mysql ให้มีประสิทธิภาพมากยิ่งขึ้น ทำงานได้เร็วขึ้น ที่โปรแกรมเมอร์ บางท่านอาจจะยังไม่รู้ มาฝากกันครับ เพราะการเขียนโปรแกรมเพื่อให้ได้ระบบงานที่ตรงตามความต้องการของผู้ใช้งานนั้นสำคัญแล้ว แต่การเขียนโปรแกรมที่ดี และคำนึงถึงประสิทธิภาพของการทำงานของระบบงานที่เราพัฒนาขึ้นนั้น สำคัญยิ่งกว่า

[PHP]

  • คำสั่ง echo จะทำงานเร็วกว่าคำสั่ง print
  • การสั่ง echo ถ้าใส่ ‘string’ จะทำงานเร็วกว่าใส่ “sting” เนื่องจากว่าตัว php จะตรวจสอบว่ามี variable อยู่ใน “” หรือเปล่า แต่จะไม่ตรวจสอบใน ‘’
  • ในการเขียน for loop ควรกำหนดจำนวนครั้งสูงสุดของการวนรอบไว้ก่อนที่จะเข้ามาใน loop ไม่ควรมากำหนดค่าหรือเปลี่ยนค่าภายใน loop
  • อย่าเรียกใช้ function ข้างใน for loop เช่น ($x=0; $x < count($array); $x) เพราะมันต้องเสียเวลาเรียก count() ทุกครั้งที่วน loop
  • ตัวแปรไหนที่ไม่ใช้แล้ว ก็ควรจะ unset ทิ้งไปซะ เก็บไว้ก็เปลืองหน่วยความจำ โดยเฉพาะพวก array ใหญ่ๆ
  • คำสั่ง str_replace จะทำงานเร็วกว่าคำสั่ง preg_replace แต่คำสั่ง strtr ทำงานเร็วกว่าคำสั่ง str_replace ถึง 4 เท่า
  • การใส่เครื่องหมาย @ นำหน้าคำสั่งเพื่อไม่ให้แสดงข้อความ error ยิ่งจะทำให้ระบบช้าลง
  • สั่งปิดการเชื่อมต่อกับ database ถ้าใช้งานเสร็จแล้ว
  • การระบุ index ของ array โดยใส่เครื่องหมาย single quote ‘’ ครอบไว้ เช่น $row[‘id’] จะทำงานเร็วกว่าไม่ใส่เครื่องหมาย เช่น $row[id] ถึง 7 เท่า
  • ถ้าจะใช้ if … elseif … elseif … elseif … else … หลายๆอันแบบนี้ เปลี่ยนมาใช้ switch case ดีกว่า
  • การเพิ่มค่าของ local variable จะทำงานเร็วสุด และการเรียกใช้ local variable ใน function ก็ใช้เวลาใกล้เคียงกัน
  • การเพิ่มค่าของ global variable จะช้ากว่าการเพิ่มค่า local variable 2 เท่า
  • การเพิ่มค่าของ property ของ object เช่น $this->prop++ จะช้ากว่าการเพิ่มค่าของ local variable 3 เท่า
  • การเพิ่มค่าของ local variable ที่ไม่ได้ถูกประกาศไว้ จะช้าเป็น 9-10 เท่าของการเพิ่มค่าใน local variable ที่ถูกประกาศไว้ก่อนแล้ว เพราะว่า php ต้องเสียเวลาประกาศตัวแปรใหม่ก่อนแล้วค่อยเพิ่มค่า
  • การประกาศ global variable ทิ้งไว้แล้วไม่ใช้ จะทำให้การทำงานช้าลง
  • ในภาษา php การใช้ ++$i จะเร็วกว่า $i++ เพราะคำสั่ง ++$i ใช้ 3 opcode แต่ $i++ ใช้ 4 opcode
  • ในการหาความยาวของ string ปกติแล้วเราจะใช้คำสั่ง strlen() ซึ่งเป็น function แต่เราสามารถประยุกต์ใช้คำสั่ง isset() มาใช้เพื่อให้ทำงานเร็วกว่าได้ เพราะคำสั่ง isset() ไม่ได้เป็น function ดังนั้นจะลดการเสียเวลาในการเรียกใช้ function ไปได้เยอะ ตัวอย่างการใช้งาน
if(strlen($foo) < 5) { echo “Foo is too short”; } เทียบกับ 
if (!isset($foo{5})) { echo “Foo is too short”; }
  • ถ้าไม่จำเป็นต้องเขียน OOP ก็ไม่ต้องเขียน เพราะการเขียน OOP จะใช้ memory มากกว่า
  • การประมวลผลคำสั่ง php จะช้ากว่าการแสดงผลหน้า HTML ธรรมดาอยู่ 2-10 เท่า หน้าไหนที่ไม่จำเป็นต้องเขียนด้วย php ถ้าเป็นไปได้ก็ควรเขียนเป็น HTML ธรรมดาจะดีกว่า

[MySQL]

  • ถ้าจะ SELECT ค่ามาแค่ 1 row ไม่ควรใช้ SELECT * ใช้ SELECT 1 แล้วใส่ Limit เป็น 1 จะดีกว่า
SELECT 1 FROM user WHERE state = ‘Alabama’ LIMIT 1″;

  • ถ้าจะเก็บค่าใน field เป็น VARCHAR ซึ่งมีค่าซ้ำๆกับ เช่น มี column ชื่อ status สำหรับเก็บค่า “active”, “inactive”, “pending” แนะนำให้เก็บเป็นแบบ ENUM จะเร็วกว่า VARCHAR
  • ไม่ควรเก็บค่าเป็น NULL ถ้าไม่จำเป็นจริงๆ เพราะถึงยังไงค่า NULL ก็ยังต้องใช้พื้นที่ในการเก็บข้อมูลอยู่ดี และอาจมีปัญหาในกรณีที่ต้องการ JOIN หรือเรียกใช้งานภายหลังได้ ทางที่ดีถ้าเราสามารถกำหนดค่า Default ไปเลยได้จะดีกว่า เช่น height ถ้าไม่ใส่อะไรเลยจะมีค่าเป็น 0 แทนที่จะเป็น NULL
  • การเก็บค่า IP Address สามารถเก็บเป็น UNSIGNED INT ได้ เพราะจะใช้พื้นที่ในการเก็บแค่ 4 Byte เวลาจะเก็บก็แปลงจาก IP เป็น Int ก่อนก่อนโดยใช้คำสั่ง SQL ชื่อ INET_ATON() และถ้าจะแปลงกลับก็ใช้ INET_NTOA() หรือถ้าจะใช้ PHP แปลงก็ใช้คำสั่ง ip2long()และแปลงกลับโดยใช้ long2ip()
  • การกำหนดความยาวของข้อมูลใน field ไว้ จะดีกว่าไม่กำหนด เช่น กำหนด VARCHAR(20) ดีกว่าเป็น VARCHAR เฉยๆ เพราะ MySQL จะใช้เวลาในการค้นหาข้อมูลน้อยกว่า
  • เลือกใช้ Database Engine ให้เหมาะสม โดยปกติใน MySQL จะนิยมใช้ Engine อยู่ 2 ตัวคือ MyISAM กับ InnoDB ซึ่งทั้ง 2 แบบก็มีข้อดีข้อเสียแตกต่างกัน MyISAM เหมาะกับงานที่เน้นการอ่านข้อมูลปริมาณมากๆ แต่ถ้ามีการเขียนเยอะๆ จะทำได้ไม่ดีนัก เช่นถ้าเราสั่ง UPDATE 1 row แล้วทั้ง table จะถูกล็อกไว้ process อื่นจะเข้ามาอ่านไม่ได้จนกว่า process แรกจะทำ Query เสร็จ แต่ใน InnoDB จะสามารถเลือกล็อกแค่ row เดียวได้
  • ระวังเรื่องการใช้ Persistance Connection เพราะบางทีเราเขียนโปรแกรมไม่ดี ทำให้ Apache เปิด child process ขึ้นมาใหม่ แล้วสร้าง connection ขึ้นมาอีกรอบ ทำให้เกิดปัญหา connection limit หรือ memory leak ได้


แชร์บทความ

Facebook Twitter Google Digg Reddit LinkedIn StumbleUpon Email
กำลังโหลด ...