ทำไมต้องใช้ innodb_file_per_table
เพราะง่ายต่อการจัดการรายบุคคลเพราะสามารถทำได้ที่ระดับไฟล์ ซึ่งหมายความว่าแม้ว่าเซิร์ฟเวอร์จะไม่ทำงานคุณยังสามารถคัดลอกข้อมูลโดยการคัดลอกไฟล์ตารางในขณะที่ใช้พื้นที่ตารางแบบแบ่งใช้หมายความว่าการคัดลอกทุกสิ่งที่อาจมีขนาดใหญ่เกินความจำเป็นหรือค้นหาวิธีที่ทำให้เซิร์ฟเวอร์ทำงานเพื่อดึงข้อมูล คุณไม่ต้องการแยกข้อมูลด้วยตนเองด้วย hex-editor)
มีคนเตือนว่าคุณไม่สามารถคัดลอกและวาง.ibd
ไฟล์จากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งได้ สิ่งนี้อาจเป็นจริง แต่ไม่ควรใช้กับการสำรองข้อมูลบนเซิร์ฟเวอร์เดียวกัน (ฉันใช้คำว่าbackupที่นี่ในแง่ของการทำสำเนาแบบดั้งเดิมคือไม่ได้เปลี่ยนแปลงอย่างมาก) ยิ่งไปกว่านั้นibdata1
จะถูกสร้างขึ้นใหม่โดยอัตโนมัติเมื่อเริ่มต้น (ดังที่เห็นในขั้นตอนลบibdata1
ของคู่มือ“ แปลงเป็นไฟล์ต่อตาราง” ส่วนใหญ่) ดังนั้นคุณจะไม่ต้องคัดลอกibdata1
นอกเหนือไปจากของ.ibd
ไฟล์ (และสอดคล้องกันของพวกเขา.frm
, ไฟล์อื่น ๆ )
หากพยายามที่จะกู้คืนตารางที่หายไปก็ควรจะเพียงพอที่จะคัดลอกมัน.ibd
และ.frm
ไฟล์เช่นเดียวกับinformation_schema
(ซึ่งเป็นมากมีขนาดเล็กกว่าibdata1
) ด้วยวิธีนี้คุณสามารถวางไว้ในเซิร์ฟเวอร์จำลองและแยกตารางของคุณโดยไม่ต้องคัดลอกทั้งหมด
อย่างไรก็ตามการเรียกร้องเพื่อประสิทธิภาพที่ดีขึ้นเป็นที่น่าสงสัย …ด้วย innodb_file_per_table จำเป็นต้องใช้การทำงานของดิสก์ I / O เพิ่มเติม และสิ่งนี้มีความสำคัญในการเข้าร่วมที่ซับซ้อนและข้อ จำกัด ที่สำคัญของต่างประเทศ
ไม่น่าแปลกใจที่ประสิทธิภาพจะขึ้นอยู่กับฐานข้อมูลเฉพาะที่ใช้งานทั้งหมด คนคนหนึ่งจะมีผลลัพธ์ที่แตกต่างจากคนอื่น
มันเป็นความจริงว่าจะมีผมดิสก์มากขึ้น / O การดำเนินงานที่มีโต๊ะไฟล์ต่อ แต่เพียงเล็กน้อยมากขึ้น คิดว่าระบบทำงานอย่างไร
สำหรับฐานข้อมูลเสาหิน:
- เซิร์ฟเวอร์เริ่มทำงาน
ibdata1
เปิดแล้ว
- อ่านส่วนหัวและเมตาดาต้า
- โครงสร้างและเมตาดาต้าถูกแคชในหน่วยความจำ
- คำค้นหาเกิดขึ้น
- เซิร์ฟเวอร์เข้าถึงดิสก์และอ่านข้อมูลจากที่เปิดอยู่แล้ว
ibdata1
- เซิร์ฟเวอร์อาจแคชข้อมูลในหน่วยความจำ
สำหรับฐานข้อมูลต่อตาราง:
- เซิร์ฟเวอร์เริ่มทำงาน
ibdata1
เปิดแล้ว
- อ่านส่วนหัวและเมตาดาต้า
- แต่ละ
.ibd
ไฟล์ถูกเปิด
- ส่วนหัวและข้อมูลเมตาจะอ่านจากแต่ละ
.ibd
ไฟล์
- โครงสร้างและเมตาดาต้าถูกแคชในหน่วยความจำ
- คำค้นหาเกิดขึ้น
- เซิร์ฟเวอร์เข้าถึงดิสก์และอ่านข้อมูลจาก
.ibd
ไฟล์ที่เปิดอยู่แล้ว
- เซิร์ฟเวอร์อาจแคชข้อมูลในหน่วยความจำ
คุณจะสังเกตเห็นว่าเมื่อเซิร์ฟเวอร์กำลังทำงานคุณไม่สามารถย้ายไฟล์ข้อมูลได้เนื่องจากเซิร์ฟเวอร์มีการจัดการเปิดอยู่ นี่เป็นเพราะเมื่อมันเริ่มขึ้นมันจะเปิดขึ้นมาและเปิดทิ้งไว้ มันไม่ได้เปิดและปิดพวกเขาสำหรับแต่ละแบบสอบถาม
ดังนั้นจึงมีการดำเนินการ I / O เพียงเล็กน้อยเท่านั้นในตอนเริ่มต้นเมื่อเซิร์ฟเวอร์เริ่มทำงาน ไม่ใช่ในขณะที่กำลังทำงาน นอกจากนี้ในขณะที่แต่ละ.ibd
ไฟล์มีค่าใช้จ่ายแยกต่างหาก (ลายเซ็นไฟล์โครงสร้าง ฯลฯ ) พวกเขาจะถูกเก็บไว้ในหน่วยความจำและไม่อ่านอีกครั้งสำหรับแต่ละแบบสอบถาม นอกจากนี้โครงสร้างเดียวกันจะถูกอ่านแม้จะมีพื้นที่ตารางที่ใช้ร่วมกันดังนั้นจึงแทบไม่มีหน่วยความจำเพิ่มเติมใด ๆ (ถ้ามีเลย)
innodb_file_per_table มีผลต่อประสิทธิภาพที่ดีขึ้นของ mysql หรือไม่?
อันที่จริงถ้ามีอะไรที่ผลการดำเนินงานในความเป็นจริงอาจจะเลวร้ายยิ่ง
เมื่อใช้ร่วมกันตารางพื้นที่การอ่านและการดำเนินการเขียนบางครั้ง / ibdata
มักจะนำมารวมกันเพื่อให้เซิร์ฟเวอร์อ่านแถบข้อมูลจากหลายตารางในหนึ่งไปจาก
อย่างไรก็ตามหากข้อมูลถูกกระจายออกไปในหลาย ๆ ไฟล์มันจะต้องทำการแยก I / O แยกสำหรับแต่ละไฟล์
แน่นอนว่าสิ่งนี้ขึ้นอยู่กับฐานข้อมูลที่เป็นปัญหาอีกครั้ง ผลกระทบต่อประสิทธิภาพการทำงานจริงของโลกจะขึ้นอยู่กับขนาดความถี่แบบสอบถามและการกระจายตัวภายในของพื้นที่ตารางที่ใช้ร่วมกัน บางคนอาจสังเกตเห็นความแตกต่างใหญ่ขณะที่คนอื่นอาจไม่เห็นผลกระทบเลย
Tablespace ใช้งานร่วมกันบน ibdata เดียว พื้นที่ตารางเฉพาะสำหรับตารางแยกต่างหากสามารถประหยัดพื้นที่ดิสก์ได้อย่างไร
มันไม่ใช่. หากมีสิ่งใดจะเพิ่มการใช้งานดิสก์ได้บ้าง
ฉันไม่มีฐานข้อมูล 60GB ที่จะทดสอบ แต่ฐานข้อมูลส่วนบุคคล“ paltry” ของฉันซึ่งมีการติดตั้ง WordPress ของฉันและมีตารางเล็ก ๆ น้อย ๆ สำหรับการทดสอบการใช้งานส่วนตัวและการพัฒนาที่มีน้ำหนักประมาณ ~ 30MB ในขณะที่ใช้พื้นที่ตารางร่วม หลังจากแปลงเป็นไฟล์ต่อตารางแล้วมันจะขยายเป็น ~ 85MB แม้จะวางทุกอย่างและนำเข้าอีกครั้งก็ยังคง> 60MB
การเพิ่มขึ้นนี้เกิดจากสองปัจจัย:
น้อยที่สุดขนาดibdata1
เป็น-ด้วยเหตุผลบางอย่าง-10MB, แม้ว่าคุณจะมีอะไร แต่information_schema
เก็บไว้ในนั้น
ด้วยพื้นที่ตารางที่ใช้ร่วมกันจะibdata1
มีค่าใช้จ่ายเช่นเดียวกับลายเซ็นไฟล์ meta-data เป็นต้น แต่ด้วยตารางต่อ.ibd
ไฟล์แต่ละไฟล์จะมีทั้งหมดนั้น ซึ่งหมายความว่ายอดรวม (แม้จะมี <10MB สมมุติibdata1
) จะค่อนข้างใหญ่กว่าอย่างน้อย:
GetTotalSizeofOverhead() * GetNumTables()
เห็นได้ชัดว่าสิ่งเหล่านี้จะไม่เพิ่มขึ้นอย่างมาก (เว้นแต่ว่าคุณกำลังใช้โฮสต์ที่ จำกัด ขนาดฐานข้อมูลของคุณหรือเก็บไว้ในแฟลชไดรฟ์ ฯลฯ ) แต่จะเพิ่มขึ้นอย่างมากและในขณะที่สลับตารางทุกไฟล์ ต่อหนึ่งตารางคุณสามารถหดตัวibdata1
ลงไป 10MB, รวมโดยรวมอย่างสม่ำเสมอจะมีมากขึ้นกว่าเดิม