คืออะไรInnoDB
และMyISAM
ในMySQL
?
คืออะไรInnoDB
และMyISAM
ในMySQL
?
คำตอบ:
InnoDB
และเป็นเครื่องมือสำหรับการจัดเก็บMYISAM
MySQL
สองสิ่งนี้แตกต่างกันในการใช้งานการล็อก: InnoDB
ล็อกแถวเฉพาะในตารางและMyISAM
ล็อกทั้งMySQL
ตาราง
คุณสามารถระบุประเภทได้โดยให้MYISAM
หรือInnoDB
ขณะสร้างตารางใน DB
มองไปที่
InnoDB เป็นเครื่องมือจัดเก็บข้อมูลสำหรับ MySQL ซึ่งรวมเป็นมาตรฐานในไบนารีปัจจุบันทั้งหมดที่จัดจำหน่ายโดย MySQL AB การเพิ่มประสิทธิภาพหลักของเครื่องมือจัดเก็บข้อมูลอื่น ๆ ที่มีให้ใช้กับ MySQL คือการรองรับธุรกรรมที่เป็นไปตาม ACID
MyISAM เป็นเครื่องมือการจัดเก็บข้อมูลเริ่มต้นสำหรับรุ่นของระบบ MySQL การจัดการฐานข้อมูลเชิงสัมพันธ์ก่อน 5.5 1 เป็นไปตามรหัส ISAM รุ่นเก่า แต่มีส่วนขยายที่มีประโยชน์มากมาย ข้อบกพร่องที่สำคัญของ MyISAM คือไม่มีการรองรับธุรกรรม เวอร์ชันของ MySQL 5.5 ขึ้นไปได้เปลี่ยนไปใช้โปรแกรม InnoDB เพื่อให้แน่ใจว่ามีข้อ จำกัด ด้านความสมบูรณ์ของการอ้างอิงและการทำงานพร้อมกันที่สูงขึ้น
เป็นเครื่องมือจัดเก็บข้อมูล
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 (นอกเหนือจากการใช้งานที่ง่ายและประสิทธิภาพที่ดีโดยไม่ต้องปรับแต่ง) สำหรับการดำเนินการทั้งหมดที่จำเป็นต้องทำธุรกรรมเพียงแค่ใช้ InnoDB อย่างไรก็ตาม MyISAM สามารถเร่งความเร็วได้อย่างแท้จริงเมื่อไม่จำเป็นต้องทำธุรกรรมในบางสถานการณ์และต้องการพื้นที่ดิสก์และ RAM น้อยกว่าเมื่อเทียบกับ InnoDB
ที่กล่าวว่า InnoDB ดีขึ้นตลอดเวลา:
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 หากต้องการหลีกเลี่ยงผลกระทบพร้อมกัน
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
เมื่อเซิร์ฟเวอร์ MySQL ของคุณขัดข้องสามารถกู้คืนข้อมูลจากชุดตาราง MyISAM ได้ง่ายกว่าไฟล์ธุรกรรม InnoDB ขนาดใหญ่ ตาราง MyISAM แต่ละตารางจะมีไฟล์แยกกันและหากไม่มีการดำเนินการเขียนในตารางนี้ในระหว่างที่เกิดข้อขัดข้องตารางนั้นจะไม่ได้รับผลกระทบทั้งหมด ในกรณีของ InnoDB ไฟล์ธุรกรรมทั้งหมดของเซิร์ฟเวอร์ MySQL ทั้งหมดจะต้องได้รับการจัดทำดัชนีใหม่หรือไม่ว่าจะทำอะไรก็ตามหลังจากเกิดปัญหา ที่จะยุ่งมาก
InnoDB เป็นค่าเริ่มต้น NOT myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "InnoDB เป็นเครื่องมือจัดเก็บข้อมูล MySQL เริ่มต้นเว้นแต่คุณจะกำหนดค่าเครื่องมือจัดเก็บข้อมูลเริ่มต้นอื่น สร้างคำสั่ง TABLE โดยไม่มี ENGINE = clause สร้างตาราง InnoDB "