MySQL แคชแบบสอบถามหรือไม่


19

ฉันกำลังเชื่อมต่อฐานข้อมูล MySQL กับPHP Data Objects (PDO) และดำเนินการสืบค้น SQL ที่กว้างขวาง โดยปกติจะใช้เวลาประมาณ 1,500 ms; ฉันยังต้องเพิ่มประสิทธิภาพ เมื่อฉันรันสคริปต์ PHP สองครั้งโดยมีช่วงเวลาสั้น ๆ ระหว่างการสืบค้นจะใช้เวลาประมาณ 90 ms เท่านั้น แบบสอบถามอยู่ในทั้งสองกรณีเดียวกัน เมื่อฉันเรียกใช้สคริปต์ด้วยแบบสอบถามเดียวกันหลังจากเวลาอีกครั้งมันใช้เวลา 1500 ms อีกครั้ง

ทำไมถึงเป็นอย่างนั้น? แคชฐานข้อมูลอัตโนมัติหรือไม่ มีบางครั้งที่ฐานข้อมูลบันทึกแคชแล้วลบออกโดยอัตโนมัติหรือไม่

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

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


แสดงรหัสของคุณ ฉันไม่ต้องการคำสั่งของคุณเป็นวิธีที่คุณทดสอบ

3
ใช่ mySQL แคชแบบสอบถาม มันฉลาดเช่นนั้น

@Kasyx รหัสอะไร? มันเป็นเพียง PDO พื้นฐาน แต่ฉันไม่คิดว่า PHP สามารถแคชได้เพราะฉันรันสคริปต์ PHP สองครั้งฉันไม่เรียกใช้แบบสอบถามสองครั้งในสคริปต์เดียว คุณสามารถอธิบายได้ไหมว่าทำไมคุณถึงแก้ไขpdoในขณะที่มันไม่เกี่ยวข้องกับคำถาม

3
DBMS ทั้งหมดมีแคชระดับหน้าบางอย่าง หลายคนไปไกลกว่านั้นโดยแคชแผนปฏิบัติการแบบสอบถามหรือแม้กระทั่งผลลัพธ์แบบสอบถาม (รวมถึงMySQL ) ฉันสงสัยว่าสิ่งสุดท้ายนี้คือผู้ร้ายหลักสำหรับพฤติกรรมที่คุณสังเกตเห็น
Branko Dimitrijevic

คุณกำลังแทรกทุกนาทีหรือไม่ เรียงที่ออกมาครั้งแรก!
โทมัส

คำตอบ:


15

นี้น่าจะเป็นสิ่งประดิษฐ์ของแคชแบบสอบถาม MySQL

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

จากเอกสาร MySQL ที่ลิงค์ด้านบน:

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


5

ใช่ mySQL (เหมือนกับผลิตภัณฑ์ฐานข้อมูลยอดนิยมอื่น ๆ ทั้งหมด) แคชแบบสอบถามที่ทำไว้กับมัน

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

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

คุณสามารถอ่านเพิ่มเติมได้ที่นี่ในคู่มือของ MySQL

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


2
"ในฐานะของ MySQL 5.1.17 แคชแบบสอบถามจะใช้สำหรับคำสั่งที่เตรียมไว้ภายใต้เงื่อนไขที่อธิบายไว้ในส่วน 8.6.3.1," วิธีการทำงานของแคชแบบสอบถาม "ก่อนที่ 5.1.17 แคชแบบสอบถามจะไม่ถูกใช้สำหรับงบที่เตรียมไว้" dev.mysql.com/doc/refman/5.1/en/query-cache.html

1
" เหมือนกับผลิตภัณฑ์ฐานข้อมูลยอดนิยมอื่น ๆ ทั้งหมด " นั่นเป็นความเข้าใจผิดเล็กน้อย DBMS แทบจะไม่เก็บผลการสืบค้นอย่างที่ MySQL ทำ DBMS มักจะมีเพียงโต๊ะแคช (หรือดัชนี) ข้อมูลที่ไม่ได้ผลการค้นหา ส่วนใหญ่ทำแคชแผน exeution แบบสอบถาม (และแบบสอบถาม "แหล่งที่มา")
a_horse_with_no_name

3
"บ่อยครั้งที่มันสามารถใช้แคชสำหรับคิวรีแม้ว่าพารามิเตอร์ที่แน่นอนของคิวรีจะไม่เหมือนกัน" ก็ไม่ถูกต้องสมบูรณ์ แบบสอบถามต้องเป็นแบบไบต์ต่อไบต์เหมือนกับแบบสอบถามที่ถูกเรียกใช้ก่อนหน้านี้และยังคงแคชเพื่อให้สามารถใช้งานได้จากแคช แม้ความแตกต่างระหว่างSELECT *และselect *หมายถึงแบบสอบถามที่เหมือนกันจะไม่ถูกนำเสนอจากแคช dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html โพสต์ลิงก์ 5.1 เพื่อความมั่นคง แต่ใช้ได้กับทุกเวอร์ชั่น
Michael - sqlbot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.