Programming

เทคนิคการเขียนโค้ด PHP และ MySQL เพื่อเพิ่ม Performance

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

[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 ได้

    ขอขอบคุณข้อมูลจาก

    63+ best practice to optimize PHP code performances
    Top 20+ MySQL Best Practices

    Advertisements

    5 thoughts on “เทคนิคการเขียนโค้ด PHP และ MySQL เพื่อเพิ่ม Performance

    1. เจ๋งครับ มีฉบับแปลไทยด้วย เคยคิดจะแปลบทความแบบนี้เหมือนกันแต่ยังไม่สำเร็จซักบทความ 🙂

    Leave a Reply

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / Change )

    Twitter picture

    You are commenting using your Twitter account. Log Out / Change )

    Facebook photo

    You are commenting using your Facebook account. Log Out / Change )

    Google+ photo

    You are commenting using your Google+ account. Log Out / Change )

    Connecting to %s