InnoDB และ MyISAM แตกต่างกันอย่างไร


17

ฉันใช้ MySQL เป็นฐานข้อมูลของฉันสำหรับโครงการเว็บปัจจุบันของฉัน ฉันใหม่กับ MySQL โปรดอธิบายความแตกต่างระหว่าง InnoDB กับ MyISAM ให้ฉันทราบ


อย่าลังเลที่จะเพิ่ม Tagg MySQL เป็นอย่างดี :)
โยฮัน

สิ่งนี้ไม่ได้อยู่ใน stackoverflow ใช่ไหม
ripper234

@ ripper234 ทั้งสองรุ่นที่ดีขึ้นของโพสต์นี้ (พื้นหลังที่ไกลมากขึ้น; สาธิตมากขึ้นของการวิจัยก่อนหน้านี้) ที่มีอยู่บน SO: stackoverflow.com/q/12614541/209139และstackoverflow.com/q/20148/209139
TRiG

คำตอบ:


14

ISAM = วิธีการเข้าถึงการจัดทำดัชนีตามลำดับและเป็นไฟล์แบบแฟลต (สำหรับ DBA เหล่านั้นที่สามารถจำ, คิดว่า Btrieve หรือ B-Tree) มันเป็นเทคโนโลยีที่เก่าแก่มาก - แต่อย่าปล่อยให้สิ่งนั้นทำให้คุณเลิกใช้งาน เนื่องจากเป็นไฟล์แบบแฟลต (เพิ่มเติมในภายหลัง) จึงไม่ใช่ความสัมพันธ์จึงไม่ใช่ RDBMS จึงเหมาะสมกว่าในบางสถานการณ์

InnoDB เป็น RDBMS แบบที่คุณคุ้นเคย MyISAM สามารถสร้างความสัมพันธ์ผ่านเลเยอร์อื่นที่อยู่ด้านบนซึ่งดูแลลิงก์ตรรกะและความสมบูรณ์ของการอ้างอิงของคุณ

ISAM ยอดเยี่ยมถ้าคุณมีเรคคอร์ดจำนวนมาก (เช่น 20 ล้าน) และเร็กคอร์ดส่วนใหญ่เป็นแบบสแตนด์อโลน (เช่นคุณไม่จำเป็นต้องทำลิงก์จำนวนมากเพื่อดึงข้อมูลที่เกี่ยวข้อง) มันขึ้นอยู่กับดัชนีเป็นอย่างมากและหากคุณไม่มีดัชนีที่ถูกต้องให้เตรียมพร้อมสำหรับการสืบค้นที่ยาวมาก ๆ ตัวอย่างในประเด็น: เรามีตาราง Btrieve ISAM พร้อมระเบียน 20M + และทำการดึงและกรองข้อมูลตามดัชนีที่แม่นยำนั้นเกือบจะทันที การใช้ดัชนีที่ไม่ถูกต้องคือ 15 นาที

InnoDB เหมาะอย่างยิ่งหากคุณมีลิงค์เชิงสัมพันธ์จำนวนมาก ตาราง A อ้างอิงเขตข้อมูลในตาราง B ซึ่งอ้างอิงถึงตาราง C และ D. InnoDB สามารถดึงข้อมูลเหล่านี้โดยใช้วิธีการเข้าร่วมที่ดี (hash joins, ฯลฯ ) ในขณะที่ฐานข้อมูล ISAM จะต้องเรียกใช้แบบสอบถามย่อยหลายรายการสำหรับทุก ๆ แถวและจับคู่ระเบียนด้วยตนเอง

คุณจะต้องทำหลักสูตรในฐานข้อมูลจริงๆหากคุณต้องการรายละเอียดมากกว่านั้น!


ISAM นั้นมีความสัมพันธ์เหมือนอย่างอื่นมันไม่เหมาะสำหรับมัน
LapTop006

ขอบคุณ 4 คำอธิบายสั้น ๆ ของคุณ ตอนนี้โดยทั่วไปฉันถูกล้าง

5

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


2

ทุกวันนี้เว้นแต่ว่าคุณกำลังใช้ตารางสำหรับข้อมูลลักษณะการบันทึก (มากกว่า INSERT แล้วเลือกจากนั้นไม่มีธุรกรรม) InnoDB มักจะเร็วกว่าเชื่อถือได้มากกว่ามีคุณสมบัติอื่น ๆ อีกมากมาย

คุณสมบัติอื่น ๆ ของ MyISAM คือการค้นหาแบบเต็มซึ่งเหมาะสำหรับการใช้งานพื้นฐาน แต่คนส่วนใหญ่ใช้ Lucene จากบางสิ่งที่ร้ายแรง

ไม่ว่าจะด้วยวิธีใดคุณต้องปรับแต่ง MySQL เนื่องจากค่าเริ่มต้นนั้นถูกกำหนดไว้สำหรับ Pentium ขนาด 32MB ที่ใช้ร่วมกับบริการอื่น ๆ


2

ช้าไปนิดหน่อยกับเกม ... แต่นี่เป็นโพสต์ที่ครอบคลุมมากฉันเขียนเมื่อไม่กี่เดือนก่อนโดยมีรายละเอียดความแตกต่างที่สำคัญระหว่าง MYISAM และ InnoDB คว้าคัปป้า (และอาจเป็นบิสกิต) และเพลิดเพลิน


ความแตกต่างที่สำคัญระหว่าง MyISAM และ InnoDB คือการอ้างอิงที่สมบูรณ์และธุรกรรม นอกจากนี้ยังมีข้อแตกต่างอื่น ๆ เช่นการล็อกการย้อนกลับและการค้นหาข้อความแบบเต็ม

Referential Integrity

Referential integrity ช่วยให้มั่นใจได้ว่าความสัมพันธ์ระหว่างตารางยังคงสอดคล้องกัน โดยเฉพาะอย่างยิ่งนี่หมายถึงเมื่อตาราง (เช่นรายชื่อ) มีรหัสต่างประเทศ (เช่นรหัสผลิตภัณฑ์) ชี้ไปที่ตารางอื่น (เช่นผลิตภัณฑ์) เมื่อมีการอัพเดทหรือลบเกิดขึ้นกับตารางชี้ไปที่การเปลี่ยนแปลงเหล่านี้จะเรียงซ้อนกันไปยังการเชื่อมโยง โต๊ะ. ในตัวอย่างของเราหากผลิตภัณฑ์ถูกเปลี่ยนชื่อคีย์ต่างประเทศของตารางการเชื่อมโยงจะอัปเดตด้วยเช่นกัน หากผลิตภัณฑ์ถูกลบออกจากตาราง 'ผลิตภัณฑ์' รายชื่อใดที่ชี้ไปยังรายการที่ถูกลบจะถูกลบด้วย นอกจากนี้รายชื่อใหม่ใด ๆ จะต้องมีคีย์ต่างประเทศนั้นชี้ไปยังรายการที่ถูกต้องและมีอยู่

InnoDB เป็น DBMS เชิงสัมพันธ์ (RDBMS) ดังนั้นจึงมี Referential Integrity ในขณะที่ MyISAM ไม่มี

ธุรกรรมและปรมาณู

ข้อมูลในตารางได้รับการจัดการโดยใช้คำสั่ง Data Manipulation Language (DML) เช่น SELECT, INSERT, UPDATE และ DELETE กลุ่มธุรกรรมสองหรือมากกว่างบ DML ร่วมกันในหน่วยงานเดียวดังนั้นทั้งหน่วยถูกนำไปใช้หรือไม่มีมัน

MyISAM ไม่รองรับการทำธุรกรรมในขณะที่ InnoDB ทำ

หากการดำเนินการถูกขัดจังหวะในขณะที่ใช้ตาราง MyISAM การดำเนินการจะถูกยกเลิกทันทีและแถว (หรือแม้แต่ข้อมูลภายในแต่ละแถว) ที่ได้รับผลกระทบจะยังคงได้รับผลกระทบแม้ว่าการดำเนินการจะไม่เสร็จสิ้น

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

การล็อคตารางเทียบกับการล็อคแถว

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

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

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

การทำธุรกรรม & การย้อนกลับ

เมื่อคุณเรียกใช้การดำเนินการใน MyISAM การเปลี่ยนแปลงจะถูกตั้งค่า ใน InnoDB การเปลี่ยนแปลงเหล่านั้นสามารถย้อนกลับได้ คำสั่งที่ใช้บ่อยที่สุดที่ใช้ในการควบคุมการทำธุรกรรมคือ COMMIT, ROLLBACK และ SAVEPOINT 1. COMMIT - คุณสามารถเขียนการดำเนินการ DML หลายรายการได้ แต่การเปลี่ยนแปลงจะถูกบันทึกเมื่อคอมมิชชันทำ 2. ROLLBACK - คุณสามารถยกเลิกการดำเนินการใด ๆ ที่ยังไม่ได้ทำ 3. SAVEPOINT - กำหนดจุดในรายการ การดำเนินการที่การดำเนินการย้อนกลับสามารถย้อนกลับไป

ความเชื่อถือได้

MyISAM ไม่มีความสมบูรณ์ของข้อมูล - ความล้มเหลวของฮาร์ดแวร์การปิดระบบที่ไม่สะอาดและการดำเนินการที่ถูกยกเลิกอาจทำให้ข้อมูลเสียหายได้ นี้จะต้องมีการซ่อมแซมหรือสร้างใหม่ของดัชนีและตาราง

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

การจัดทำดัชนี FULLTEXT

InnoDB ไม่รองรับการจัดทำดัชนี FULLTEXT จนกระทั่ง MySQL เวอร์ชั่น 5.6.4 จากการเขียนโพสต์นี้ผู้ให้บริการโฮสติ้งที่ใช้ร่วมกันหลายคนของ MySQL ยังคงต่ำกว่า 5.6.4 ซึ่งหมายความว่าการจัดทำดัชนี FULLTEXT ไม่ได้รับการสนับสนุนสำหรับตาราง InnoDB

อย่างไรก็ตามนี่ไม่ใช่เหตุผลที่ถูกต้องในการใช้ MyISAM เป็นการดีที่สุดที่จะเปลี่ยนเป็นผู้ให้บริการโฮสติ้งที่รองรับ MySQL เวอร์ชั่นล่าสุด ไม่ใช่ตาราง MyISAM ที่ใช้การทำดัชนี FULLTEXT ไม่สามารถแปลงเป็นตาราง InnoDB ได้

ข้อสรุป

โดยสรุป InnoDB ควรเป็นเครื่องมือเก็บข้อมูลเริ่มต้นที่คุณเลือก เลือก MyISAM หรือชนิดข้อมูลอื่นเมื่อตอบสนองความต้องการเฉพาะ


1

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


3
Excecpt ที่ไม่เป็นความจริงอีกต่อไป InnoDB นั้นเร็วกว่าในกรณีส่วนใหญ่
LapTop006

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