คิวรีช้าสำหรับตาราง wp_options


16

ฉันติดตามบันทึกการสืบค้นช้าของเว็บไซต์ที่ใช้ WP (ด้วยค่าเริ่มต้นของlong_query_time ที่ตั้งค่าเป็น 10) และฉันสังเกตเห็นว่าแบบสอบถามต่อไปนี้มักจะถูกบันทึกไว้ -

# User@Host: root[root] @ localhost []
# Query_time: 0  Lock_time: 0  Rows_sent: 394  Rows_examined: 458
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

ฉันไม่เข้าใจว่าตารางขนาดเล็กเช่นนี้อาจใช้เวลาในการดำเนินการมากน้อยเพียงใด นี่เป็นเพียงอาการของปัญหาอื่นหรือไม่? (ปัจจุบันเรียกใช้ Moodle, phpbb และ WP บน VM เฉพาะ)

คำตอบ:


16

ปรับปรุง : เหตุผลในแบบสอบถามจะถูกบันทึกไว้คือมันไม่ได้ใช้ดัชนี เวลาของแบบสอบถามคือ 0 นั่นคือมันจะดำเนินการอย่างรวดเร็ว คุณสามารถยกเลิกการตั้งค่าตัวเลือก "log-query-not-using-indexes" หากคุณไม่ต้องการให้บันทึกสิ่งเหล่านี้

ตาราง wp_options ไม่มีดัชนีบน autoload ดังนั้นแบบสอบถามจึงสิ้นสุดการทำการสแกนตารางแบบเต็ม โดยทั่วไปตารางนั้นไม่ควรใหญ่เกินไปดังนั้นจึงไม่ใช่ปัญหา แต่ฉันเดาว่ากรณีของคุณจะเกิดขึ้น

การเพิ่มดัชนีอาจช่วยแก้ปัญหาได้ แต่เนื่องจาก TheDeadMedic ชี้ให้เห็นในความคิดเห็นอาจไม่ได้หากค่าของ autoload นั้นส่วนใหญ่เป็นใช่หรือกระจายอย่างสม่ำเสมอระหว่างใช่และไม่ใช่:

ก่อนอื่นให้ทำแบบสอบถามนี้เพื่อดูว่าการกระจายมีลักษณะอย่างไร:

SELECT COUNT(*), autoload FROM wp_options GROUP BY autoload;

หากส่วนใหญ่ส่วนใหญ่ถูกตั้งค่าเป็น 'ไม่' คุณสามารถแก้ปัญหาได้ในตอนนี้ด้วยการเพิ่มดัชนีใน autoload

ALTER TABLE wp_options ADD INDEX (`autoload`);

อย่างไรก็ตามคุณอาจต้องการไปที่ด้านล่างของสาเหตุที่ตารางนั้นมีขนาดใหญ่เกินไป อาจมีปลั๊กอินที่เขียนไม่ดีทำบางสิ่งบางอย่างคาว


2
ฉันสงสัยดัชนีในกรณีนี้จะมีกำไรใด ๆ - ตรวจสอบบทความนี้ใน cardinality
TheDeadMedic

ขึ้นอยู่กับว่าตัวเลือกส่วนใหญ่ตั้งค่าเป็น autoload หรือไม่ ฉันจะไม่คิด แต่ในตารางไม่ควรใหญ่จนเกินไปดังนั้นมีบางสิ่งบางอย่างที่กำลังเกิดขึ้น
Vinay Pai

1
ฉันอัพเดตโดยคำตอบเพื่อเพิ่มบิตเกี่ยวกับการตรวจสอบการกระจายของค่า
Vinay Pai

1
ฉันเพิ่งสังเกตเห็นความคิดเห็นและตระหนักว่าคำตอบของฉันผิดทั้งหมด แบบสอบถามไม่ได้ช้าจริง ๆ ... มันเป็นเพียงการบันทึกในบันทึกแบบสอบถามช้าเพราะไม่ได้ใช้ดัชนี
Vinay Pai

1
ขอบคุณคำถามนี้และคำตอบที่ฉันค้นพบว่าฉันมี 90k รายการในตาราง wp_options ของฉัน 88.5k ซึ่งถูกตั้งค่าเป็น autoload false ส่วนที่เหลือเป็นรายการ "ชั่วคราว" ทั้งหมดที่เพิ่มโดยปลั๊กอิน (น่าจะเป็นแคช?) การเพิ่มดัชนีในคอลัมน์ autoload ทำให้โหลด mySql ของฉันลดลงจากค่าเฉลี่ย 89% ถึง 2.5% ในทันที ตัวแทนการตรวจสอบแสดงเวลาตอบสนองของเว็บไซต์ของฉันลดลงจาก 1900ms เป็น 500ms นี่คือ gamechanger สำหรับฉัน
มอ

5

ฉันเจอคำถามที่กล่าวถึงใน mytop ที่ทำงานบนเซิร์ฟเวอร์ของฉันไม่กี่วันที่ผ่านมา - และจริง ๆ แล้วมันใช้เวลาค่อนข้างนาน (ประมาณ 10 วินาที) สำหรับแต่ละแบบสอบถาม! ดังนั้นจึงมีสถานการณ์ในโลกแห่งความเป็นจริงที่ wp_options อาจมีขนาดใหญ่ขึ้น ในกรณีของฉันฉันสงสัยว่าปลั๊กอินแคชCachifyจะรับผิดชอบในการ bloating wp_options

ข้อมูลของ wp_options นี้โดยเฉพาะ:

5,309 rows
130MB of data

ฉันได้เพิ่มดัชนีที่คล้ายกับโซลูชันที่โพสต์โดย Vinay Pai ซึ่งแก้ไขปัญหาได้อย่างไร้ที่ติ


1

ตาราง wp_options ของฉันมีข้อมูลประมาณ 235 แถวเท่านั้น ฉันพยายามจัดทำดัชนีตาราง แต่ไม่ได้ช่วย

ปรากฎว่ามีการแทรกตัวเลือกชั่วคราว 150 รายการลงในตาราง แต่ไม่ได้ถูกลบโดยอัตโนมัติ

ฉันไม่รู้ว่าเกี่ยวข้องหรือไม่ แต่ฉันดูไฟล์ /var/log/apache2/access.log ของฉันแล้วสังเกตว่ามีเซิร์ฟเวอร์ Amazon Web Services หลายเซิร์ฟเวอร์ (ที่อยู่ IP ที่ขึ้นต้นด้วย 54) XXX และ 32.XXX) พยายามเอาเปรียบ /~web-root-dir/xmlrpc.php

หลังจากการแก้ไขปัญหาบางอย่างฉันสอบถามตาราง wp_options สำหรับชื่อตัวเลือกที่มี "ชั่วคราว"

เลือก * จาก wp_options โดยที่ option_name เช่น '% transient %';

หนึ่งในฟิลด์ที่ส่งคืนจากเคียวรีนี้คือ 'option_value' ซึ่งมีประเภทข้อมูลของ LONGTEXT ตาม mySQL docs ฟิลด์ LONGTEXT (สำหรับแต่ละแถว) สามารถเก็บข้อมูลได้สูงสุด 4 กิกะไบต์

เมื่อผมดำเนินการแบบสอบถามบางส่วนของแถว (จำกำลังทำงานกับผู้ที่มี "ชั่วคราว") มีขนาดใหญ่ปริมาณของข้อมูลในฟิลด์ option_value เมื่อมองดูผลลัพธ์ฉันยังเห็นความพยายามฉีดคำสั่งในกระบวนการ wp-cron ด้วยความหวังว่าจะถูกดำเนินการในระหว่างรอบ cron

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

หลังจากทำเช่นนี้เซิร์ฟเวอร์ก็ตอบสนองอีกครั้ง

แบบสอบถามเพื่อลบแถวเหล่านี้:

ลบจาก wp_options โดยที่ option_name เช่น '% transient %';

ฉันได้เพิ่ม AWS IP address / 8 superblocks ไปยังไฟร์วอลล์ของฉันด้วย (-:


อ๋อ ฉันกำลังทุกข์ทรมานจาก "ความเร็วในการโหลด 40 วินาที" เช่นกันจนกว่าฉันจะค้นพบว่าฉันมี 20,000 wp_option บันทึกด้วยข้อมูลขนาดใหญ่ที่พวกเขากำลังโหลดทุกหน้า การลบไซต์เหล่านั้นที่เร่งความเร็วขึ้นอย่างมาก
JasonGenX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.