เป็นการปฏิบัติทั่วไปหรือไม่ที่จะผสมตาราง InnoDB และ MyISAM บนเซิร์ฟเวอร์เดียวกัน


21

ฉันมีฐานข้อมูลเดียวประมาณ 4.5GB ที่ทำงานบนเซิร์ฟเวอร์ที่มี 8GB RAM ตารางส่วนใหญ่คือ MyIsam (ประมาณ 4.3GB) แต่ในไม่ช้าฉันจะแปลงบางส่วนเป็น InnoDB (มันจะเป็นกระบวนการที่ช้าโดยเน้นไปที่ตารางที่เน้นการเขียนมากที่สุดในตอนแรก)

มีอะไรผิดปกติในการใช้งานเซิร์ฟเวอร์เฉพาะซึ่งมีเอ็นจินการจัดเก็บทั้งสองประเภทอยู่หรือไม่?


Is there anything wrong with running a dedicated server where both types of storage engines exist? อาจจะใช้ถ้อยคำใหม่Multiple types?
จอห์

เหตุผลเดียวที่ฉันพูดว่า 'ทั้งสอง' เป็นเพราะคำถามนี้เกี่ยวกับเครื่องยนต์หลักสองตัวที่กำหนดค่าให้ 'ปรับละเอียด' ฉันพยายามที่จะเพิกเฉยต่อเอนจิ้นประเภทอื่น ๆ เช่น MEMORY หรือ MERGE ซึ่งผิดปกติมากพอที่ Afaik จะไม่ใช่วัตถุของการปรับแต่งประสิทธิภาพ
Derek Downey

คำตอบ:


18

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

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

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

ให้ฉันสังเกตว่าบัฟเฟอร์ของคุณมีบทบาทในความยุ่งเหยิงนี้ทั้งหมด หากคุณใช้ทั้ง MyISAM และ InnoDB คุณจะต้องระวังว่า key_buffer และ innodb_buffer_pool ของคุณไม่ได้โต้แย้ง นี่จะเป็นการวางแผนอย่างรอบคอบในส่วนของคุณ แต่นั่นคือสิ่งที่เราทำ


4
+1 อีกกรณีการใช้งานทั่วไปคือ MyISAM สำหรับตารางที่ต้องการค้นหาข้อความแบบเต็มและ InnoDB สำหรับตารางอื่น ๆ ทั้งหมด
Asaph

@Aseph: แม้ในเวลาที่ความคิดเห็นของคุณที่ InnoDB สนับสนุนดัชนี Fulltext
BlueRaja - Danny Pflughoeft

2
^^^^ "ฟีเจอร์ MySQL 5.6" ไม่ใช่ GA จนถึง 2013-02-05
Randomx

1
@ randymelder คำตอบที่ดี คุณจะสามารถอธิบายรายละเอียดเกี่ยวกับสิ่งที่คุณหมายถึงโดย "คุณจะต้องระวังว่า key_buffer และ innodb_buffer_pool ของคุณไม่โต้แย้ง"
Neel

1
ฉันต้องการพิสูจน์ว่าผิด แต่ตรรกะตรงข้ามกับstackoverflow.com/a/6796566/5645769ที่นี่
TᴀʀᴇǫMᴀʜᴍᴏᴏᴅ

7

ฉันไม่สามารถบอกคุณได้ว่านี่เป็นเรื่องธรรมดา ฉันสามารถพูดเกี่ยวกับประสบการณ์ของตัวเอง

ฉันมักจะใช้เครื่องมือที่ดีที่สุดสำหรับงานดังนั้นฉันจึงผสมผสานเครื่องยนต์ตลอดเวลา โครงการส่วนใหญ่ของฉันใช้ MyISAM เป็นเครื่องมือเริ่มต้น

เมื่อฉันต้องการคุณสมบัติพิเศษที่มีอยู่ใน InnoDB ฉันจะไปหามัน

เมื่อตารางเป็นแบบอ่านอย่างเดียวส่วนใหญ่ฉันเลือกโปรแกรมเก็บถาวรก่อนที่จะกระพริบตา

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

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

แน่นอนว่าคุณไม่สามารถรักษาความสมบูรณ์และความสอดคล้องของการผสม InnoDB และ MyISAM กับข้อความค้นหาที่ไม่ซ้ำใครได้


เครื่องมือเก็บถาวรไม่รองรับการจัดทำดัชนีดังนั้นทำไมคุณจึงจัดเก็บไว้ในที่เก็บถาวร
user4951

0

ฉันพยายามหลีกเลี่ยงการผสมตาราง MyISAM และ InnoDB ในฐานข้อมูลเดียวกัน แต่นี่คือเหตุผลเพื่อสุขภาพจิตมากกว่าเหตุผลเชิงปฏิบัติ อย่างไรก็ตามฉันพบว่ามีประโยชน์ที่จะมีฐานข้อมูลพร้อมกับตาราง MyISAM สำหรับการค้นหาแบบเต็มเพื่อให้ฉันสามารถเรียกใช้บนไซต์ได้ การเก็บไว้ในฐานข้อมูลแยกต่างหากพร้อมกับมี foreign key สำหรับแต่ละรายการทำให้ง่ายสำหรับนักพัฒนาคนอื่น ๆ ที่ทำงานกับฐานข้อมูลเพื่อดูว่าเกิดอะไรขึ้น


คุณจะมีคีย์ต่างประเทศได้อย่างไรเมื่อคุณใช้ MyISAM
a_horse_with_no_name

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