เคล็ดลับที่เป็นประโยชน์สำหรับการค้นหาและแก้ไขการสืบค้นฐานข้อมูล WordPress ที่ช้า

เผยแพร่แล้ว: 2019-04-17

การสอบถาม SQL ในระดับปานกลางอาจทำให้การดำเนินการของไซต์พัฒนาแอปพลิเคชัน WordPress หยุดชะงัก บางครั้ง การสอบถามในระดับปานกลางเป็นผลพวงของ SQL ที่มีโครงสร้างไม่เพียงพอซึ่งไม่ควรทำแบบนั้น

ยิ่งไปกว่านั้น ในบางกรณี การสอบถามในระดับปานกลางนั้น ในความเป็นจริง คำถามสั้นๆ ณ จุดหนึ่ง—แต่เมื่อไซต์มีความช่ำชองมากขึ้น การสอบสวนก็ช้าลงและช้าลง ไม่มีอำนาจที่จะรับรู้ถึงฐานข้อมูลที่ขยายเพิ่ม

แม้ว่า SQL จะอยู่ในระดับปานกลาง เราควรตรวจสอบสองวิธีในการค้นหาและแก้ไขปัญหาในการพัฒนาแอปพลิเคชัน WordPress ที่นี่และที่นั่นอาจต้องใช้เว็บแอปพลิเคชันบางอย่างและอาจไม่มีพลังงาน ความถนัด หรือแผนการใช้จ่ายเพียงพอที่จะทำการปรับปรุงที่กำหนดเอง การสร้างโดยไม่ต้องเตรียมการใด ๆ อาจเป็นคำตอบสำหรับปัญหาบางอย่าง แต่อาจใช้เวลานานกว่าการเริ่มต้นจากฐานรหัสปัจจุบัน ในขั้นต้น WordPress มีโครงสร้างเป็นขั้นตอนการเขียนบล็อก และยังคงมีความโดดเด่นสำหรับสิ่งนั้น อย่างไรก็ตาม มันได้ก้าวเข้าสู่ระบบการจัดการเนื้อหา (CMS) ที่สมบูรณ์ และสำหรับวัตถุประสงค์บางประการ สามารถสร้างเว็บแอปพลิเคชันที่แข็งแกร่ง ได้อย่างรวดเร็วและด้วยแผนการใช้จ่ายที่ต่ำกว่าการปรับปรุงแบบกำหนดเอง แม้ว่า WordPress จะนำเสนอแอพพลิเคชั่นสำหรับการพัฒนาในตัว แต่ก็สามารถใช้กับเว็บแอพพลิเคชั่นได้ เพื่อที่จะทำให้มันมีประโยชน์เป็นพิเศษ โครงสร้างหน้าและโพสต์โดยธรรมชาติสามารถนำไปใช้ได้หลายอย่าง แต่หากต้องการข้อมูลและฟิลด์ที่กำหนดเองเพื่อรวม ค้นหาหรือตั้งคำถาม ควบคุม และแสดง จำเป็นต้องมีงานพิเศษบางอย่าง

การค้นหาข้อความค้นหาที่ช้า

การค้นหาที่มาของคำถามระดับปานกลางประกอบด้วยสองขั้นตอน:

  1. ค้นหาว่าคำถามใดเป็นคำถามที่ปานกลาง
  2. การระบุโปรแกรมที่กำลังทำงานอยู่

เราควรตรวจสอบสองโมดูลและหนึ่ง SaaS ที่สามารถทำให้พวกเขาค้นพบคำถามในระดับปานกลางได้

ตรวจสอบแบบสอบถาม

คุณสามารถใช้โมดูลนี้เพื่อใช้ข้อมูลที่เป็นประโยชน์เกี่ยวกับเพจที่กำลังรันอยู่ แม้จะมีคลัสเตอร์ข้อมูลทั้งหมดเกี่ยวกับกิจกรรมภายในของ WordPress แต่ก็ให้รายละเอียดแบบจุดต่อจุดของ:

  • มีกี่คำถามที่เกิดขึ้นกับความต้องการนี้?
  • การสอบถามใดในหน้าใดใช้เวลานานที่สุด
  • ความสามารถใดที่ทุ่มเทพลังงานให้กับคำถาม SQL มากที่สุด
  • ไม่ว่าคำถามเหล่านั้นจะมาจากโมดูล หัวข้อ หรือศูนย์ WordPress

หน้าจอสอบถามสามารถจดจำคำถามที่ปานกลางด้วยเนื้อหาสีแดงที่น่าตกใจ ซึ่งทำให้ง่ายต่อการเลือกปัญหา SQL

แถบดีบัก

เครื่องมือมหัศจรรย์อีกตัวในการค้นหา SQL ที่เย็นจัดคือโมดูล Debug Bar ที่เก่าและเชื่อถือได้ Debug Bar ให้ข้อมูลหนึ่งเกี่ยวกับการทำงานภายในของ WordPress เมื่อโหลดหน้าด้วยเรื่องต่างๆ เช่น:

  1. พารามิเตอร์ของ WP_Query
  2. ขอข้อมูล (นับการประสานกฎการปรับปรุง)
  3. สอบถาม SQL ที่สร้างโดยหน้าปัจจุบัน

ในการเปิดใช้งานการติดตาม SQL ใน Debug Bar ผู้ใช้ควรกำหนดให้ SAVEQUERIES อยู่ที่ใดที่หนึ่งในไซต์ ซึ่งน่าจะอยู่ใน wp-config.php

ข้อควรระวัง: SAVEQUERIES ส่งผลต่อการดำเนินการบนไซต์ และไม่น่าจะใช้บนเซิร์ฟเวอร์รุ่น อย่างไรก็ตาม สามารถใช้กับเครื่องจักรแห่งความก้าวหน้าได้

การค้นหา SQL ระดับปานกลางนั้นไม่ใช่เรื่องง่ายด้วย Debug Bar ตัวอย่างเช่น จะไม่ให้ตารางที่จัดเรียงได้หรือคุณลักษณะการสอบถามข้อมูลในระดับปานกลางสำหรับผู้ใช้ สิ่งที่ Debug Bar มีให้คือความสามารถในการติดตามที่นำผู้ใช้ไปยังทิศทางของที่มาของคำถามอย่างแม่นยำ

นี่คือบทสรุปของเอกสารที่โหลดและความสามารถที่ส่งผลให้มีการสอบสวน บ่อยกว่านั้น มีคนกระตือรือร้นที่ส่วนการดำเนินต่อโดยสมบูรณ์ในบทสรุป นี่คือที่ที่ถามคำถามปานกลางและที่ที่ควรเริ่มต้นการล่าของเขา สิ่งที่สะดวกเกี่ยวกับการมีการตั้งค่าความจุทุกรายการที่พร้อมท์คำถามนี้คือสามารถเปิดเผยข้อมูลเชิงลึกว่าทำไม SQL ถูกดำเนินการในทุกกรณี

NewRelic

NewRelic คือการดูแลระบบที่วัดและคัดกรองการดำเนินการของการพัฒนาเว็บแอปพลิเคชัน รวมถึงการพัฒนาแอปพลิเคชัน WordPress ฝ่ายบริหารให้ข้อมูลมากมายเกี่ยวกับการดำเนินการของไซต์ เป็นเรื่องง่ายๆ ที่จะสูญเสียความรู้สึกถึงทิศทางทั้งหมดในข้อมูลที่ NewRelic ให้รายละเอียดทุกนาทีแก่ผู้ใช้สำหรับการสอบถาม SQL

มีความแตกต่างที่น่าสังเกตสองประการระหว่าง NewRelic และโมดูลที่เราอ้างอิงก่อนหน้านี้:

  1. NewRelic ให้ข้อมูลเชิงลึกเกี่ยวกับการดำเนินการของ PHP มากขึ้น จนถึงการคำนวณเวลาที่ใช้ในแต่ละฟังก์ชันอย่างแม่นยำ
  2. NewRelic ติดตามความต้องการแต่ละอย่างของไซต์ออกไป เพื่อให้สามารถอ้างอิงได้ในภายหลังเพื่อค้นหา SQL ในระดับปานกลาง โมดูลเพียงแค่ให้หน้าปัจจุบันแก่เขา

เป็นสิ่งสำคัญที่ NewRelic มีระดับการจัดเรียงฟรีที่ให้ข้อมูลทั่วไปเกี่ยวกับการดำเนินการของไซต์ อย่างไรก็ตาม หนึ่งจะต้องเลื่อนขึ้นไปยังการจัดการแบบชำระเงินสำหรับอัตราต่อรองแฟนซี และสิ้นสุดสำหรับการตรวจสอบความต้องการเฉพาะตัวและค้นหาคำถามในระดับปานกลาง

ทำความเข้าใจกับข้อความค้นหาที่ช้าด้วย EXPLAIN

จนถึงจุดนี้ อุปกรณ์ได้รับการรักษาความปลอดภัยสำหรับการค้นหาคำถามปานกลาง ในปัจจุบันนี้น่าจะทราบกันดีอยู่แล้วว่าเหตุใดคำถามเหล่านั้นจึงเป็นอุปสรรคต่อสิ่งต่างๆ

คำสำคัญ MySQL EXPLAIN สามารถเปิดใช้งาน er เพื่อชี้แจงสิ่งที่เกิดขึ้น การเพิ่ม EXPLAIN ที่จุดเริ่มต้นของการสอบถามจะระบุว่า MySQL ดำเนินการกับคำถามอย่างไร สำหรับการสอบถามที่ซับซ้อน EXPLAIN สามารถช่วยแยกแยะการเน้นปานกลางใน SQLs ตัวอย่างเช่น การสืบค้นย่อยในระดับปานกลางหรือกิจกรรมที่สิ้นเปลือง

แก้ไขการสืบค้นข้อมูลช้า

เนื่องจากทราบว่าข้อความค้นหาอยู่ในระดับปานกลาง และได้ให้คำอธิบายแก่ผู้ใช้ว่าเหตุใดจึงเป็นเช่นนั้น ควรพิจารณาทางเลือกสองสามทางเพื่อแก้ไขปัญหาที่ง่วงนอนเหล่านั้น

ตัวเลือกที่ 1: บิดคำถาม

อาจมีคำถามที่ทำให้หน้าจอแก้ไขโพสต์มีอัตราที่ช้ามาก การสอบถามเป็นส่วนหนึ่งของเมตาบ็อกซ์ของฟิลด์ที่กำหนดเอง

ส่วนที่แน่นอนของ SQL กำลังนำรายการ meta_keys จากตาราง ks29so_postmeta ซึ่งในความน่าจะเป็นทั้งหมดไม่ได้เริ่มต้นด้วยเครื่องหมายขีดล่าง คำอธิบาย GROUP BY บอกเป็นนัยว่าแต่ละผลลัพธ์นั้นพิเศษ

ดำเนินการสอบถามนี้หลายครั้ง นี่คือเวลาที่ต้องใช้:

1.7145 วินาที

1.7911 วินาที

1.8076 วินาที

1.7707 วินาที

1.8456 วินาที

หนึ่งอาจพัฒนาแบบสอบถามซึ่งส่งผลให้เกิดผลลัพธ์ที่คล้ายคลึงกัน จะต้องได้รับเลือกให้เป็น meta_keys ที่ไม่ซ้ำแบบใคร Exceptional เป็นคำที่เทียบเท่ากันโดยเฉพาะ ซึ่งเป็นคำอธิบายของ SQL!

ตัวเลือกที่ 2: การเพิ่มดัชนี

ในขณะที่ผู้ใช้กำลังเรียกใช้คำถาม SQL บนตาราง MySQL ที่ตั้งไว้ จำเป็นต้องตรวจสอบทั้งตารางเพื่อให้เข้าใจได้ว่าบรรทัดใดมีความสำคัญต่อการสอบถามโดยเฉพาะ เมื่อโต๊ะใหญ่ขึ้น การตรวจสอบก็จะเริ่มใช้เวลาพอสมควร

นั่นคือที่ที่ระเบียน MySQL เข้ามา รายการใช้ข้อมูลในตารางและจัดเรียงเพื่อให้ข้อมูลมีความต้องการน้อยลงในการค้นหา โดยการจัดเรียงข้อมูลด้วยวิธีเฉพาะ ไฟล์ช่วยลดการวัดผลการกรอง MySQL ที่ทำได้สำหรับการสอบถามแต่ละครั้ง

ไฟล์สามารถเพิ่มลงในเซ็กเมนต์เดียวหรือหลายส่วนได้

ด้วยไฟล์บน meta_key เวลาคำถาม SQL แรกสุดจะคล้ายกับสิ่งนี้:

0.0041 วินาที

0.0023 วินาที

0.0030 วินาที

0.0025 วินาที

0.0019 วินาที

นี่มันฉลาดมาก

นิพจน์ของการแจ้งเตือนบนไฟล์: ทุกครั้งที่ INSERT สร้างคอลัมน์หรือ UPDATE ถูกใช้ในตาราง af รายการจะถูกกำหนดใหม่ซึ่งอาจเป็นกิจกรรมที่มีราคาแพง บันทึกทำให้การอ่านจากตารางเร็วขึ้น แต่การเขียนถึงโต๊ะจะช้าลง แม้ว่ารายการดัชนีที่วางอย่างเหมาะสมสามารถทำงานได้ดีมาก แต่ก็ไม่ควรหมกมุ่นอยู่กับรายการโดยไม่ตรวจสอบผลกระทบทั่วไปของรายการในฐานข้อมูล

ตัวเลือก 3: แคชผลลัพธ์การค้นหา

เมื่อรู้ว่ามีคำถามปานกลาง แทนที่จะเปลี่ยนคำถาม อาจมีสถานการณ์ที่มันเพียงแค่เอาผลที่ตามมาของการสอบสวนออกไป ด้วยวิธีนี้ ใครจะจำกัดวิธีการสอบสวนเป็นประจำ และเขาจะได้รับ "บัตรผ่านฟรี" บ่อยกว่าไม่

WordPress Transients API เป็นหนึ่งในวิธีการจองคิวรี Transients ถูกนำมาใช้เพื่อขจัดผลที่ตามมาของงานที่มีค่าใช้จ่ายสูง เช่น

  • คำขอไปยังไซต์ภายนอก (เช่น รับโพสต์ Facebook อย่างต่อเนื่อง)
  • การจัดการที่ช้า (เช่น ค้นหาสตริงขนาดใหญ่ที่มีข้อต่อตามธรรมเนียม)
  • สอบถามฐานข้อมูลช้า!
การเลือกแนวทาง

มีทางเลือกมากมายที่วางไว้ และมีแนวโน้มมากที่สุด 17 วิธีในการทำความเข้าใจการไต่สวนในระดับปานกลางนี้ แนวทางใดที่ควรใช้?

ตัวเลือกที่ 1 (เปลี่ยนคำถาม) ให้ผลลัพธ์ที่ยอดเยี่ยม อย่างไรก็ตาม ควรพิจารณาความเป็นไปได้ว่าการสอบถามที่แก้ไขแล้วโดยทั่วไปไม่มีผลลัพธ์ที่คล้ายคลึงกัน อาจมีคนถอดรหัสรหัสโดยไม่ตั้งใจด้วยคำถามที่ไม่น่าสนใจ

ทางเลือกที่ 2 (รวมถึงบันทึก) ไม่สามารถเกิดขึ้นได้อย่างต่อเนื่องโดยบังเอิญอยู่บนโต๊ะและส่วนต่างๆ ที่ใช้โดยการสอบสวน เนื่องจากตารางศูนย์พัฒนาแอปพลิเคชัน WordPress เราจะต้องเน้นที่ผลกระทบอื่น ๆ ของบันทึก:

  • รูทีนการรีเฟรชศูนย์คาดหวังรายการเพิ่มเติมหรือไม่
  • จะรวมไฟล์กลั่นกรองคำถามต่าง ๆ คล้ายกับ INSERT และ UPDATE หรือไม่?

ทางเลือกที่ 3 (จองผลลัพธ์โดยวิธีคนจรจัด) มีผลเล็กน้อย ผู้ใช้ไม่จำเป็นต้องเปลี่ยนคำถามแรกและไม่จำเป็นต้องปรับโครงสร้างฐานข้อมูล

โดยปกติ ผู้คนจะเลือกใช้ตัวเลือกที่ 3 ในบางกรณี เขาอาจเลือกทางเลือกอื่นขึ้นอยู่กับคำถามที่เขากำลังแก้ไขหรือไซต์เฉพาะที่มีปัญหาเกี่ยวกับ SQL แน่นอนว่าไม่มีคำตอบเดียวที่ตอบโจทย์ทุกปัญหาในการดำเนินการ ดังนั้นจึงอนุญาตให้วิธีหนึ่งแตกต่างไปจากการตัดสินใจของผู้อื่น หรือพยายามทำทุกข้อในสามข้อโดยไม่ชักช้า!

กำลังปรับปรุง

ได้ร่างปัญหาที่แท้จริงไว้ที่นี่ กล่องฟิลด์ที่กำหนดเองใน CSS-Tricks เป็นผู้กระทำความผิดอย่างแท้จริงสำหรับการสอบถามฐานข้อมูลในระดับปานกลาง ยังได้ร่างแนวทางต่างๆ ไปสู่การเตรียมการที่เป็นไปได้เช่นเดียวกัน

คิดค้นไอเดียใหม่ๆ

มีวิธีการต่างๆ ที่สามารถทำได้เพื่อพยายามและเร่งการดำเนินการของคำถาม ซึ่งรวมถึงการทำงานมากกว่าการปรับแต่งการสอบถามหรือการรวมรายการ ส่วนที่ช้าที่สุดของคำถามคืองานที่ทำเพื่อเข้าร่วมตารางเพื่อเปลี่ยนจากรหัสลูกค้าเป็นรหัสรายการ และต้องทำสิ่งนี้สำหรับลูกค้าแต่ละราย

หนึ่งสามารถทำให้ข้อมูลปกติได้โดยการทำตารางที่เก็บข้อมูลใบอนุญาต ข้างรหัสลูกค้าและรหัสรายการสำหรับใบอนุญาตทั้งหมด และเพียงแค่สอบถามเกี่ยวกับข้อมูลนั้นสำหรับลูกค้ารายใดรายหนึ่ง หนึ่งจะต้องแก้ไขตารางโดยใช้ทริกเกอร์ MySQL บน INSERT/UPDATE/DELETE ไปยังตารางใบอนุญาต (หรืออื่น ๆ ขึ้นอยู่กับว่าข้อมูลสามารถเปลี่ยนแปลงได้อย่างไร) อย่างไรก็ตาม สิ่งนี้จะช่วยปรับปรุงการดำเนินการสอบถามข้อมูลนั้นอย่างมีนัยสำคัญ

ดังนั้น หากการรวมหลาย ๆ เข้าด้วยกันทำให้คำถามใน MySQL ลดลง อาจเร็วกว่าที่จะแยกส่วนการสอบถามออกเป็นอย่างน้อยสองข้อต่อและดำเนินการอย่างอิสระใน PHP จากนั้นจึงรวบรวมและจัดช่องทางผลลัพธ์ในโค้ด