การบันทึกมีผลต่อประสิทธิภาพของ MySQL - แต่ทำไม?


9

ฉันค่อนข้างประหลาดใจที่ฉันไม่สามารถเห็นคำตอบนี้ได้ทุกที่บนเว็บไซต์แล้วหรือในเอกสาร MySQL ( ส่วนที่ 5.2ดูเหมือนว่าจะมีการบันทึกอย่างดี!)

หากฉันเปิดใช้งาน binlogs ฉันจะเห็นประสิทธิภาพเล็ก ๆ (ส่วนตัว) ซึ่งคาดว่าจะมี IO เพิ่มเติมเล็กน้อย - แต่เมื่อฉันเปิดใช้งานบันทึกแบบสอบถามทั่วไปฉันเห็นประสิทธิภาพการทำงานที่ยอดเยี่ยมมาก (เพิ่มเวลาในการเรียกใช้แบบสอบถามเป็นสองเท่า) หรือแย่กว่านั้น) มากกว่าที่ฉันเห็นด้วย binlogs แน่นอนตอนนี้ฉันกำลังบันทึกทุก SELECT และทุก UPDATE / INSERT แต่ daemons อื่น ๆ จะบันทึกทุกคำขอของพวกเขา (Apache, Exim) โดยไม่ขัดจังหวะ

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

แน่นอนฉันทำบันทึกการสืบค้นช้าและมีการปรับปรุงเล็กน้อยในการใช้งานทั่วไปถ้าฉันปิดการใช้งานนี้

(ทั้งหมดนี้อยู่ใน Ubuntu 10.04 LTS, MySQLd 5.1.49 แต่การวิจัยชี้ให้เห็นว่านี่เป็นปัญหาสากลที่ค่อนข้างเป็นธรรม)

คำตอบ:


9

บันทึกแบบสอบถามทั่วไปเป็นจำนวนมากมากขึ้นกว่า IO บันทึกไบนารี นอกเหนือจากข้อเท็จจริงที่ว่าเซิร์ฟเวอร์ SQL ส่วนใหญ่เป็น 90% อ่านถึง 10% เขียนบันทึกไบนารีจะถูกเก็บไว้ในรูปแบบไบนารีแทนที่จะเป็นข้อความธรรมดาที่ใช้พื้นที่ดิสก์น้อยลง (พื้นที่น้อยเท่าไหร่ฉันไม่แน่ใจขออภัย)

มีสองด้านว่าทำไม Apache และ Exim สามารถบันทึกทุกคำขอโดยไม่มีผลกระทบต่อประสิทธิภาพที่สำคัญ ข้อแรกคือพวกเขาบันทึกความจริงที่ว่าคำขอเกิดขึ้น แต่สิ่งที่พวกเขาใส่ไว้ในบันทึกมักจะมีขนาดเล็กกว่าคำขอจริง คำขอ HTTP มักจะมีขนาดใหญ่เป็นสองเท่าของบรรทัดที่เข้าสู่บันทึกและแม้แต่อีเมลข้อความธรรมดาสั้น ๆ ก็มีขนาดใหญ่กว่าบรรทัดบันทึกที่มีขนาด 10 หรือ 20 เท่า อีเมลที่มีไฟล์แนบ 10MB จะยังคงมีเพียงไม่กี่บรรทัดในบันทึก

ส่วนที่สองของเรื่องนี้คือในเว็บแอปพลิเคชันทั่วไปโดยทั่วไปจะมีคำสั่ง SQL จำนวนมากที่เชื่อมโยงกับหน้า HTTP เดียว อีเมลมักจะมีจำนวนน้อยกว่าคำขอ HTTP เซิร์ฟเวอร์ MySQL ของคุณอาจพยายามเข้าสู่ระบบมากกว่า Apache หรือ Exim

ดูขนาด (ไม่บีบอัด) ของบันทึก MySQL แบบไบนารีและทั่วไปและบันทึก Apache และ Exim ของคุณ ณ สิ้นวัน ฉันจะเดิมพันคุณพบว่าบันทึกทั่วไปของ MySQL นั้นใหญ่ที่สุดโดยมีค่าอย่างน้อย 5 ตัว


1
ข้อดีบางประการ - โดยเฉพาะอย่างยิ่งใช่ GET เพียงใบเดียวกับแอปพลิเคชันของเราสามารถทำให้เลือกได้ถึง 100s เนื่องจากแม้ว่าเราพยายามทำมากที่สุดเท่าที่จะทำได้ในแบบสอบถามเดียวบางครั้งเราแลกเปลี่ยนประสิทธิภาพ / ความสะอาดของสิ่งนี้เพื่อ โครงสร้างที่หรูหรายิ่งขึ้นรหัสที่อ่านได้ง่ายขึ้นและฐานข้อมูลที่สะอาดขึ้น (นอกเหนือจากกันสิ่งทั้งหมดนี้เริ่มต้นจากการพูดคุยเกี่ยวกับการบันทึกเนื้อหาของ POSTs เช่นเดียวกับ URL จาก GETs เนื่องจากเราเห็น params CGI.pm เห็นในกรณีหนึ่งไม่ใช่ในกรณีอื่นและจากนั้นเป็นการเข้าสู่ระบบ / ประสิทธิภาพใน ทั่วไป). อย่างไรก็ตามมันเป็นเวลาไม่กี่ชั่วโมงดังนั้นตอบรับ ขอบคุณ!
James Green

4

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

สิ่งนี้เป็นจริงแม้ว่าจะเป็นพาร์ติชันที่แตกต่างกันในฟิสิคัลดิสก์เดียวกัน

หากการบันทึกกำลังไปยังอุปกรณ์อื่นนั่นจะช่วยลดปัญหาประสิทธิภาพบางอย่าง


1
ไม่เกี่ยวข้องกับสถานการณ์ของฉัน - มันเป็น VM โฮสต์และฐานข้อมูลนั้นอยู่ในโลจิคัลวอลุ่มที่แยกต่างหากเป็น / var ซึ่งจัดเตรียมจากอาร์เรย์หน่วยเก็บข้อมูลเดียวกัน ฉันคิดว่าในทางทฤษฎีพวกเขาอาจจะอยู่ในแกนหมุนเดียวกัน แต่มันจะรู้สึกเหมือนเป็นเรื่องบังเอิญ hell-: -) ที่กล่าวว่า +1 กันเพราะมันจะเกี่ยวข้องกับใครบางคนเช่นการติดตั้ง Debian / Ubuntu เริ่มต้น (DBs ใน / var / mysql, เข้าสู่ระบบ / var / log)!
James Green

@jimbo - ขอบคุณสำหรับประกอบฉากแม้ว่ามันจะไม่ได้โดยตรงที่ใช้บังคับกับสถานการณ์เฉพาะของคุณ :)
วอร์เรน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.