หากปลั๊กอินของคุณจะมีข้อมูลจำนวนมากการใช้wp_postmeta
ไม่ใช่ความคิดที่ดีดังที่แสดงไว้ด้านล่าง:
ยกตัวอย่าง WooCommerce ในร้านค้าที่มีผลิตภัณฑ์ ~ 30,000 รายการจะมีค่าเฉลี่ยพูด ~ 40 โพสต์เมตา (คุณลักษณะและทุกอย่าง) ต่อผลิตภัณฑ์ภาพผลิตภัณฑ์ 5 ภาพต่อผลิตภัณฑ์ซึ่งหมายความว่าจะมี 4 ภาพเมตา สำหรับแต่ละภาพ:
30,000 ผลิตภัณฑ์ x 40 เมตาละ = 1,200,000 แถว wp_postmeta
+
ผลิตภัณฑ์ 30,000 ภาพ x 5 ภาพเมตาแต่ละภาพ x 4 สำหรับแต่ละ = 600,000 แถว wp_postmeta
ดังนั้นด้วยเพียง 30,000 ผลิตภัณฑ์ที่คุณกำลังมองหาที่มี 1,800,000 wp_postmeta
แถวใน
หากคุณเพิ่มคุณสมบัติเพิ่มเติมให้กับผลิตภัณฑ์หรือรูปภาพผลิตภัณฑ์ของคุณหมายเลขนี้จะทวีคูณ
ปัญหาที่เป็นสองเท่า:
- การเข้าร่วมด้วยตนเองมีราคาแพงมากเมื่อใช้ MySQL
wp_postmeta
ตารางจะไม่ถูกทำดัชนีเว้นแต่ว่าคุณกำลังใช้เวอร์ชัน mysql ในภายหลัง (เช่นไม่มีดัชนี FULLTEXT สำหรับ meta_value
)
ในการให้ตัวอย่างจากกรณีจริง:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
การเลือกเมืองที่จัดส่งจากรายละเอียดการสั่งซื้อทั้งหมดจะมาถึงเวลาประมาณ 3 วินาทีในเซิร์ฟเวอร์เฉพาะระดับเริ่มต้นแม้ว่าจะมี 5-10 คำสั่งก็ตาม นี่เป็นเพราะแบบสอบถามถูกเรียกใช้จากwp_postmeta
ตารางที่มี ~ 3 ล้านแถวในการติดตั้งจริง
แม้กระทั่งโฮมเพจก็ค่อนข้างช้าเพราะธีมดึงองค์ประกอบต่าง ๆ จากwp_postmeta
- ตัวเลื่อนส่วนแทรกความเห็นบางส่วนและเมตาอื่น ๆ สองสามตัว ในรายการผลิตภัณฑ์ทั่วไปช้ามากการค้นหาจะช้าในทำนองเดียวกันเมื่อแสดงรายการผลิตภัณฑ์
คุณไม่สามารถแก้ไขได้ด้วยวิธีปกติ คุณสามารถใส่ Elastic Search ในเซิร์ฟเวอร์ของคุณและใช้ Elastic Search plugin ใน Wordpress คุณอาจใช้ redis / memcached คุณอาจใช้หน้าแคชที่ดี แต่ในท้ายที่สุดปัญหาพื้นฐานจะยังคงอยู่ - ดึงข้อมูลจำนวนมากจาก bloatedwp_postmeta
ตารางจะช้าเมื่อใดก็ตามที่เสร็จสิ้น บนเซิร์ฟเวอร์ที่ฉันทดสอบโซลูชันที่ฉันติดตั้งไว้ด้านล่างทั้งหมดเหล่านี้ได้รับการติดตั้งและกำหนดค่าอย่างเหมาะสมและปรับให้เหมาะสมและไซต์ทำงานได้อย่างสอดคล้องกันตกลงสำหรับผู้ใช้ที่ไม่ได้เข้าสู่ระบบหรือแบบสอบถามที่ทำกันโดยทั่วไป
แต่ช่วงเวลาที่ผู้ใช้ที่เข้าสู่ระบบพยายามที่จะทำสิ่งที่ไม่ได้ทำกันทั่วไปหรือ crons, ปลั๊กอินแคชหรือยูทิลิตี้อื่น ๆ ที่ต้องการดึงข้อมูลจริงจากฐานข้อมูลเพื่อแคชหรือทำสิ่งอื่นใดสิ่งต่าง ๆ ก็ช้าลง
ดังนั้นฉันลองอย่างอื่น:
ฉันเข้ารหัสปลั๊กอินขนาดเล็กเพื่อนำเมตาผลิตภัณฑ์ทั้งหมด (postmeta สำหรับผลิตภัณฑ์ประเภทโพสต์) ไปยังตารางที่กำหนดเองซึ่งสร้างขึ้นโดยรหัส ปลั๊กอินนี้ใช้เมตาทั้งหมดสำหรับแต่ละโพสต์และสร้างตารางโดยเพิ่มเมตาแต่ละรายการเป็นคอลัมน์และแทรกค่าลงในแต่ละแถว ฉันเปลี่ยนรูปแบบ EAV เป็นรูปแบบเชิงสัมพันธ์แนวนอนและแนวราบ ฉันยังมีปลั๊กอินสำหรับลบ postmeta จากผลิตภัณฑ์ที่ถูกย้ายทั้งหมดจากwp_postmeta
ตาราง
ในขณะที่ฉันอยู่ที่นี่ฉันย้ายสิ่งที่แนบมา postmeta ของและเมตาของโพสต์ประเภทอื่นทั้งหมดไปยังตารางของพวกเขาเอง
จากนั้นฉันก็งุ้มเข้า get_(post_type)_meta
กับตัวกรองเพื่อแทนที่การดึงข้อมูลเมตาเพื่อให้บริการจากตารางที่กำหนดเองใหม่
ตอนนี้แบบสอบถามเดียวกันจากก่อนหน้านี้ซึ่งใช้เวลาประมาณ 3 วินาทีในการดึงข้อมูล wp_postmeta
ใช้เวลา ~ 0.006 วินาที ตอนนี้ไซต์จะทำงานเหมือนกำลังติดตั้ง WP ใหม่
....................
โดยธรรมชาติการทำสิ่งต่าง ๆ เป็นวิธีที่ดีกว่า จริงๆแล้วมันเป็นบรรทัดฐาน
อย่างไรก็ตามยังเป็นความรู้ที่ชัดเจนว่าตาราง EAV นั้นไม่มีประสิทธิภาพในการปรับสเกล มีความยืดหยุ่นไม่ จำกัด และให้คุณจัดเก็บข้อมูลใด ๆ แต่ราคาที่คุณจ่ายไปนั้นเป็นประสิทธิภาพ มันเป็นการแลกเปลี่ยนขั้นพื้นฐาน
ในบริบทนั้นมันเป็นการยากที่จะบอกคนที่ตั้งใจจะมีข้อมูลจำนวนมากและ - ห้ามไม่ให้สอบถาม / ค้นหาข้อมูลนั้นเพื่อใช้wp_postmeta
ตารางอย่างแน่นอน ผลงานยอดเยี่ยมจะยอดเยี่ยม
การใช้ตารางที่กำหนดเองของคุณจะช่วยให้ข้อมูลของคุณซ้อนกันและยังคงเร็วพอ
เช่นเดียวกับที่ Pippin Williams ผู้สร้างโปรแกรมเสริม Easy Digital Downloads กล่าวถึงเขาจะใช้ตารางที่กำหนดเองหากเขาเพิ่งเริ่มเขียนโค้ดปลั๊กอินของเขาหากคุณกำลังจะสร้างบางสิ่งที่จะใช้เป็นระยะเวลานานหรือจัดเก็บข้อมูลจำนวนมาก การใช้ตารางที่กำหนดเองของคุณจะมีประสิทธิภาพมากขึ้นถ้าคุณออกแบบตารางได้ดี
คุณต้องตรวจสอบให้แน่ใจว่าผู้พัฒนาปลั๊กอิน / แอดออนอื่น ๆ มีวิธีการขอเข้าไปในปลั๊กอินของคุณเพื่อจัดการข้อมูลของคุณก่อนและหลังการดึงข้อมูล หากคุณทำเช่นนั้นแสดงว่าคุณแข็งแกร่ง