InnoDB และ MyISAM ใน MySQL คืออะไร?


122

คืออะไรInnoDBและMyISAMในMySQL?


8
MySqlซ้ำ: MyISAM เทียบกับ Inno DB! หรือคุณสามารถเลือก: stackoverflow.com/search?q=myisam+vs+innodb
OMG Ponies

มันคือโปรแกรมฐานข้อมูล ... kavoir.com/2009/09/…
Matthieu

เราสามารถใช้เครื่องมือจัดเก็บข้อมูลทั้งสองในเวลาเดียวกันสำหรับฐานข้อมูลของเราได้หรือไม่
user130561

1
คุณสามารถใช้พร้อมกันบนโต๊ะต่างๆได้ แต่สำหรับตารางที่กำหนดคุณจะต้องเลือกว่าคุณต้องการใช้โต๊ะใด ...
Matthieu

คำตอบ:


111

InnoDBและเป็นเครื่องมือสำหรับการจัดเก็บMYISAMMySQL

สองสิ่งนี้แตกต่างกันในการใช้งานการล็อก: InnoDBล็อกแถวเฉพาะในตารางและMyISAMล็อกทั้งMySQLตาราง

คุณสามารถระบุประเภทได้โดยให้MYISAMหรือInnoDBขณะสร้างตารางใน DB


คำตอบที่ชัดเจนและเรียบง่าย
vadiraj jahagirdar

38

มองไปที่

InnoDBและMyISAM

InnoDB เป็นเครื่องมือจัดเก็บข้อมูลสำหรับ MySQL ซึ่งรวมเป็นมาตรฐานในไบนารีปัจจุบันทั้งหมดที่จัดจำหน่ายโดย MySQL AB การเพิ่มประสิทธิภาพหลักของเครื่องมือจัดเก็บข้อมูลอื่น ๆ ที่มีให้ใช้กับ MySQL คือการรองรับธุรกรรมที่เป็นไปตาม ACID

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


1
เราสามารถใช้เครื่องมือจัดเก็บข้อมูลทั้งสองในเวลาเดียวกันสำหรับฐานข้อมูลของเราได้หรือไม่
user130561

2
คุณสามารถทำได้เพราะสำหรับแต่ละตารางคุณสามารถกำหนดเครื่องมือจัดเก็บข้อมูลที่แตกต่างกันได้ อีกคำถามคือถ้าคุณควร ในเอกสาร mysql มีคำอธิบายเกี่ยวกับหัวข้อนี้
nano7

18

เป็นเครื่องมือจัดเก็บข้อมูล

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

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

InnoDB: เครื่องมือจัดเก็บข้อมูลที่ปลอดภัยสำหรับธุรกรรม (ตามมาตรฐาน ACID) สำหรับ MySQL ที่มีความสามารถในการคอมมิตการย้อนกลับและการกู้คืนข้อขัดข้องเพื่อปกป้องข้อมูลผู้ใช้ การล็อกระดับแถว InnoDB (โดยไม่ต้องเลื่อนระดับไปยังการล็อกแบบละเอียดที่หยาบกว่า) และการอ่านแบบ nonlocking ที่สอดคล้องกันแบบ Oracle ช่วยเพิ่มการทำงานและประสิทธิภาพการทำงานพร้อมกันของผู้ใช้หลายคน InnoDB จัดเก็บข้อมูลผู้ใช้ในดัชนีแบบคลัสเตอร์เพื่อลด I / O สำหรับการสืบค้นทั่วไปตามคีย์หลัก เพื่อรักษาความสมบูรณ์ของข้อมูล InnoDB ยังสนับสนุนข้อ จำกัด การอ้างอิง - ความสมบูรณ์ของคีย์ต่างประเทศ


ดังนั้นในขณะที่เราติดตั้ง MySQL เราจำเป็นต้องระบุว่าเครื่องมือจัดเก็บข้อมูลใดที่จะใช้เป็นฐานข้อมูล MySQL โดยเฉพาะหรือไม่?
user130561

3
ตามที่กล่าวไว้ในโพสต์ของฉันค่าเริ่มต้นคือ MyISAM หากคุณต้องการใช้คุณสมบัติของเครื่องมือจัดเก็บข้อมูลอื่นเช่น INNODB ใช่คุณจะต้องระบุ สิ่งนี้ไม่ได้ทำระหว่างการติดตั้ง แต่จะทำในระหว่างการสร้างตารางครั้งแรก
mluebke

3
แต่ตามนี้: - dev.mysql.com/doc/refman/5.7/en/storage-engines.html ; เครื่องมือเริ่มต้นคือ InnoDB
Harsha

2
อ้างอิงจากdev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html : "เครื่องยนต์เริ่มต้นคือ InnoDB ณ MySQL 5.5.5 (MyISAM ก่อน 5.5.5)" ดังนั้นเครื่องยนต์เริ่มต้นตอนนี้ InnoDB คำตอบนี้ถูกโพสต์ 16 วันหลังจากการเปิดตัวทั่วไปครั้งแรกโดยมี InnoDB เป็นเครื่องมือเริ่มต้น;)
SOFe

6

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

ที่กล่าวว่า InnoDB ดีขึ้นตลอดเวลา:

InnoDB 1.1 การปรับปรุงประสิทธิภาพและความสามารถในการปรับขนาด


4

MyISAM ไม่ปฏิบัติตาม ACID ซึ่งต่างจาก InnoDB ซึ่งทำตามธุรกรรมเพื่อรักษาความสมบูรณ์ของข้อมูล

MyISAM รองรับการแทรกพร้อมกัน: หากตารางไม่มีบล็อกว่างตรงกลางของไฟล์ข้อมูลคุณสามารถแทรกแถวใหม่ลงไปในเวลาเดียวกันกับที่เธรดอื่นกำลังอ่านจากตาราง MySqlDoc

นั่นคือเหตุผลที่ MyISAM เร็วขึ้นและใช้พื้นที่น้อยลง ตัวอย่างเช่น MySQL MyISAM Storage Engine ไม่รองรับการทำธุรกรรม ข้อ จำกัด ของ MySQL MYISAMมีบิตที่เรียกว่าการแทรกพร้อมกัน ตามค่าเริ่มต้นตัวแปรจะถูกตั้งค่าเป็น 1 และการแทรกพร้อมกันจะได้รับการจัดการตามที่อธิบายไว้ หากตั้งค่าเป็น 0 เม็ดมีดพร้อมกันจะถูกปิดใช้งาน หากตั้งค่าเป็น 2 จะอนุญาตให้แทรกพร้อมกันที่ส่วนท้ายของตารางได้แม้กระทั่งสำหรับตารางที่มีการลบแถว สามารถเรียกใช้คำสั่ง INSERT เพื่อเพิ่มแถวที่ส่วนท้ายของตารางโดยเลือกพร้อมกันหากไม่มีรู / แถวที่ถูกลบตรงกลางตาราง (ในเวลาของการแทรกพร้อมกัน)

ระดับการแยกเริ่มต้นของ mysql InnoDB คือ "Read Repeatable" สำหรับ MyISAM ไม่มีธุรกรรมใด ๆ InnoDB ใช้การล็อกระดับแถวในขณะที่ MyISAM สามารถใช้ได้เฉพาะการล็อกระดับตารางนั่นคือสาเหตุที่ InnoDB มีการตอบสนองที่ผิดพลาดดีกว่า MyISAM เราต้องได้รับการล็อคระดับตารางด้วยตนเองใน MyISAM หากต้องการหลีกเลี่ยงผลกระทบพร้อมกัน


3

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

ในตาราง InnoDB (ธุรกรรม) การเปลี่ยนแปลงธุรกรรมสามารถยกเลิกได้อย่างง่ายดายหากจำเป็นต้องย้อนกลับ แต่การเปลี่ยนแปลงที่เกิดขึ้นกับตาราง MyISAM (ไม่ใช่ธุรกรรม) ไม่สามารถยกเลิกได้เมื่อจำเป็นต้องย้อนกลับธุรกรรม

ตัวอย่างเช่นคุณต้องการโอนเงินจากบัญชีเช็คไปยังบัญชีออมทรัพย์ สิ่งนี้ทำได้โดยธุรกรรมซึ่งมี 5 แบบสอบถาม

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

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

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

ตัวอย่างมารยาท: "MySQL ประสิทธิภาพสูง: การเพิ่มประสิทธิภาพการสำรองข้อมูลและการจำลอง" - หนังสือโดย Arjen Lentz, Derek J. Balling, Jeremy Zawodny, Peter Zaitsev และ Vadim Tkachenko


1

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


0

InnoDB เป็นค่าเริ่มต้น NOT myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "InnoDB เป็นเครื่องมือจัดเก็บข้อมูล MySQL เริ่มต้นเว้นแต่คุณจะกำหนดค่าเครื่องมือจัดเก็บข้อมูลเริ่มต้นอื่น สร้างคำสั่ง TABLE โดยไม่มี ENGINE = clause สร้างตาราง InnoDB "

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