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


245

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


23
หากคุณต้องการเอ็นจิ้นฐานข้อมูลให้ใช้ InnoDB คุณไม่สามารถเปรียบเทียบทั้งสอง
Jeremy Stein

ในขณะที่คำตอบหลายข้อด้านล่างถูกต้อง แต่พวกเขาไม่ได้ต้มสิ่งที่ชัดเจนลง IMHO ไซต์นี้ทำและประเด็นหลัก: InnoDB คือการล็อคระดับแถว MyISAM เป็นการล็อคระดับตาราง หมายความว่าโดยทั่วไป MyISAM จะดีกว่าสำหรับ OLAP (การวิเคราะห์ส่วนใหญ่อ่าน) และ InnoDB จะดีกว่าสำหรับ OLTP (ธุรกรรมส่วนใหญ่เขียนหรืออย่างน้อยก็เขียนมาก)
Mike Williamson

คำตอบ:


159

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

รายการสามารถไปอีกเล็กน้อย แต่พวกเขาทั้งสองมีข้อได้เปรียบที่ไม่ซ้ำกันในความโปรดปรานและข้อเสียของพวกเขาซึ่งกันและกัน แต่ละสถานการณ์มีความเหมาะสมกว่าในบางสถานการณ์

ดังนั้นเพื่อสรุป ( TL; DR ):

  • InnoDB มีการล็อคระดับแถว MyISAM สามารถล็อคระดับตารางแบบเต็มเท่านั้น
  • InnoDB มีการกู้คืนความผิดพลาดที่ดีขึ้น
  • MyISAM มีFULLTEXTดัชนีการค้นหา InnoDB ไม่ได้จนกว่า MySQL 5.6 (ก.พ. 2013)
  • InnoDB ใช้ธุรกรรมกุญแจต่างประเทศและข้อ จำกัด ด้านความสัมพันธ์ MyISAM ไม่ได้

ท่านที่รักดังนั้นในที่สุดสิ่งที่หนึ่งจะใช้? MyISAM หรือ InnoDB? สับสนโดยสิ้นเชิง ... เว็บไซต์ของฉันใช้ mysql และฉันต้องตัดสินใจเรื่องนี้
sqlchild

3
ขึ้นอยู่กับแอพพลิเคชั่นจดรายการที่มีคุณสมบัติที่คุณต้องการ (เช่นการค้นหาแบบเต็มข้อความคีย์ต่างประเทศ ... ) และลองเลือกหนึ่งรายการ (ลองให้คะแนนแต่ละฟีเจอร์ คุณจะไม่สามารถมีได้ทั้งหมด แต่ก็ขึ้นอยู่กับคุณที่จะตัดสินใจว่าคุณลักษณะของแม่มดเป็นสิ่งที่จำเป็นมากที่สุด
poelinca

2
ฉันแก้ไขโพสต์ของเขาเพื่อความกระจ่าง
Mathias Lykkegaard Lorenzen

1
@MathiasLykkegaardLorenzen ขอบคุณนั่นเป็นหนึ่งในเหตุผลที่เราชอบ stackexchange
poelinca

เนื่องจากversion 5.6.4InnoDB รองรับการFULLTEXTค้นหา dev.mysql.com/doc/refman/5.6/th/fulltext-restrictions.html
daydreamer

85

ความแตกต่างที่สำคัญอีกอย่างที่ไม่ได้กล่าวถึงคือวิธีการแคชสำหรับเอ็นจินการเก็บข้อมูลแต่ละตัว

MyISAM

กลไกหลักที่ใช้คือแคชคีย์ มันจะแคชหน้าดัชนีจากไฟล์. MII เท่านั้น หากต้องการกำหนดขนาดแคชหลักให้เรียกใช้คิวรีต่อไปนี้:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

สิ่งนี้จะทำให้การตั้งค่าที่แนะนำสำหรับ MyISAM Key Cache ( key_buffer_size ) ได้รับชุดข้อมูลปัจจุบันของคุณ ( แบบสอบถามจะกำหนดคำแนะนำที่ 4G (4096M)สำหรับระบบปฏิบัติการ 32 บิต 4GB เป็นขีด จำกัด สำหรับ 64 บิต, 8GB

InnoDB

กลไกหลักที่ใช้คือ InnoDB Buffer Pool มันแคชข้อมูลและหน้าดัชนีจากการเข้าถึงตาราง InnoDB หากต้องการปรับขนาด InnoDB Buffer Pool ของคุณให้เรียกใช้คิวรีต่อไปนี้:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

สิ่งนี้จะทำให้การตั้งค่าที่แนะนำสำหรับขนาดของ InnoDB Buffer Pool ( innodb_buffer_pool_size ) ได้รับชุดข้อมูลปัจจุบันของคุณ

อย่าลืมปรับขนาดไฟล์บันทึกของ InnoDB (ib_logfile0 และ ib_logfile1) ซอร์สโค้ด MySQL วางขนาดสูงสุดของไฟล์บันทึกของ InnoDB ทั้งหมดไว้ที่ <4G (4096M) เพื่อความเรียบง่ายมีเพียงสองไฟล์บันทึกนี่คือวิธีที่คุณสามารถปรับขนาดไฟล์เหล่านี้:

  • ขั้นตอนที่ 1) เพิ่ม innodb_log_file_size = NNN ไปยัง /etc/my.cnf (NNN ควรเป็น 25% ของ innodb_buffer_pool_size หรือ 2047M แล้วแต่จำนวนใดจะน้อยกว่า)
  • ขั้นตอนที่ 2) service mysql stop
  • ขั้นตอนที่ 3) rm /var/log/mysql/ib_logfile[01]
  • ขั้นตอนที่ 4) service mysql start(สร้างใหม่ ib_logfile0 และ ib_logfile1)

ข้อแม้

ในตอนท้ายของคำสั่งทั้งเป็นอินไลน์แบบสอบถาม (SELECT 2 PowerOf1024)B

  • (SELECT 0 PowerOf1024) ให้การตั้งค่าเป็นไบต์
  • (SELECT 1 PowerOf1024) ให้การตั้งค่าเป็นกิโลไบต์
  • (SELECT 2 PowerOf1024) ให้การตั้งค่าเป็นเมกะไบต์
  • (SELECT 3 PowerOf1024) ให้การตั้งค่าเป็นกิกะไบต์
  • ไม่มีพลังน้อยกว่าที่ยอมรับ 0 หรือมากกว่า 3

บทส่งท้าย

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

  • หากคุณมี RAM 2GB และ 16GB ของ InnoDB ให้จัดสรร 512M เป็น innodb_buffer_pool
  • หากคุณมี RAM 2GB และดัชนี MyISAM 4GB ให้จัดสรร 512M เป็น key_buffer_size
  • หากคุณมี 2GB RAM และ 4GB ของ MyISAM Index และ 16GB InnoDB ให้จัดสรร 512M เป็น key_buffer_size และ 512M เป็น innodb_buffer_pool_size

สถานการณ์ที่เป็นไปได้ไม่มีที่สิ้นสุด !!!

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


นั่นเป็นสูตรที่ไม่ดี!
Rick James

(อุ๊ปส์ - ลืมไปแล้วว่าไม่มีย่อหน้า) ... ฉันจะเพิ่ม "คำตอบ"
Rick James

สูตรของ Rolando สำหรับขนาดแคชนั้นไม่สามารถใช้งานได้จริง - พลังของ 2 ไม่จำเป็น - 4GB บนระบบปฏิบัติการ 32 บิตเป็นไปไม่ได้ - อื่น ๆ ต่อไปนี้เป็นบทสรุปของฉันเกี่ยวกับสิ่งที่จะตั้งเป็น: mysql.rjweb.org/doc.php/memory (เป็นที่อยู่ของการตั้งค่าอื่น ๆ ที่ส่งผลต่อการใช้หน่วยความจำ)
Rick James

2
@Rick: พลังของ 2 ถูกหมายถึงการแสดงคำตอบในหน่วยต่าง ๆ การทำ (SELECT 2 PowerOfTwo) ตั้งค่าการแสดงคำตอบเป็น MB การทำ (เลือก 3 PowerOfTwo) ตั้งค่าการแสดงผลเป็น GB (SELECT 1 PowerOfTwo) แสดงเป็น KB (เลือก 0 PowerOfTwo) แสดงเป็นไบต์ นั่นคือสิ่งที่ (SELECT 2 PowerOfTwo) ทำ ดังนั้นจึงจำเป็นต้องแสดงเท่านั้นไม่ได้กำหนดค่าที่สันนิษฐานไว้ในสถาปัตยกรรม
RolandoMySQLDBA

2
@ Rick: คุณรู้อะไรไหม ฉันจะให้ +1 คุณด้วยเหตุผลใหญ่ ๆ สองข้อ 1) URL ของคุณยืนยันว่าคำตอบของฉันถูกต้องเนื่องจาก 4GB เป็นหมายเลขที่ใหญ่ที่สุดในการกำหนดให้กับ key_buffer_size 2) คำตอบของคุณด้วย URL ของคุณทำให้หน่วยความจำเหลือน้อยมาก ฉันจะให้เครดิตเมื่อเครดิตครบกำหนด
RolandoMySQLDBA

60

ข้อเสนอ InnoDB:

  • ธุรกรรมกรด
  • การล็อคระดับแถว
  • ข้อ จำกัด คีย์ต่างประเทศ
  • การกู้คืนความผิดพลาดอัตโนมัติ
  • การบีบอัดตาราง (อ่าน / เขียน)
  • ชนิดข้อมูลเชิงพื้นที่ (ไม่มีดัชนีเชิงพื้นที่)

ใน InnoDB ข้อมูลทั้งหมดในแถวยกเว้น TEXT และ BLOB สามารถใช้งานได้สูงสุด 8,000 ไบต์ การจัดทำดัชนีข้อความแบบเต็มไม่สามารถใช้งานได้ใน InnoDB จนถึง MySQL 5.6 (ก.พ. 2013) ใน InnoDB COUNT(*)s (เมื่อWHERE, GROUP BYหรือJOINไม่ได้ใช้) ดำเนินการช้ากว่าใน MyISAM เพราะจำนวนแถวจะไม่ถูกเก็บไว้ภายใน InnoDB เก็บข้อมูลและดัชนีไว้ในไฟล์เดียว InnoDB ใช้บัฟเฟอร์พูลเพื่อแคชข้อมูลและดัชนี

ข้อเสนอ MyISAM:

  • รวดเร็วCOUNT(*)s (เมื่อWHERE, GROUP BYหรือJOINไม่ได้ใช้)
  • การจัดทำดัชนีข้อความแบบเต็ม (อัปเดต: รองรับ InnoDB จาก MySQL 5.6)
  • รอยเท้าของดิสก์ที่เล็กลง
  • การบีบอัดตารางที่สูงมาก (อ่านอย่างเดียว)
  • ประเภทข้อมูลเชิงพื้นที่และดัชนี (R-tree) (อัพเดต: รองรับใน InnoDB จาก MySQL 5.7)

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

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


5
ฉันอ่านคำตอบของคุณแล้วเปรียบเทียบกับคนอื่นที่นี่แล้ว คุณเป็นคนเดียวที่พูดถึง BLOB พวกเขามักจะได้รับอนุญาต คุณยังเป็นคนเดียวที่พูดถึง myisampack หนึ่งในวีรบุรุษที่ไม่ได้ร้องของตาราง MyISAM ที่อ่านง่าย ของคุณคือ +1 วันนี้ !!!
RolandoMySQLDBA

2
ตัวอย่างจะเป็นตารางแบบอ่านอย่างเดียวที่ถูกบีบอัดซึ่งคุณมีการอัพเดตไม่บ่อยนักโดยแทนที่ตารางอย่างเต็มที่
dabest1

30

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

โดยทั่วไปถ้าคุณมีสำเนาของข้อมูลอื่นและทำการแคชไว้ใน MySQL เท่านั้นเช่นอนุญาตให้ใช้วิธีมาตรฐานในการเข้าถึงจากเว็บไซต์ PHP ดังนั้น MyISAM ก็ใช้ได้ (เช่นดีกว่าไฟล์ CSV แบบแบนหรือไฟล์บันทึกการสืบค้นและ การเข้าถึงพร้อมกัน) หากฐานข้อมูลเป็น "สำเนาต้นแบบ" ที่แท้จริงของข้อมูลถ้าคุณกำลังทำINSERTและUPDATEใช้ข้อมูลจริงจากผู้ใช้ก็เป็นเรื่องโง่ที่จะใช้สิ่งอื่นที่ไม่ใช่ InnoDB ในระดับใดก็ตามที่ MyISAM ไม่น่าเชื่อถือและจัดการได้ยาก จะทำmyisamchkครึ่งเวลาโดยไม่สนใจประสิทธิภาพที่เพิ่มขึ้น ...

(ประสบการณ์ส่วนตัวของฉัน: DB 2 เทราไบต์ใน MyISAM)


29

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


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

ความสมบูรณ์ของ Referential

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
ขอบคุณบทสรุปที่ให้ข้อมูลและชัดเจนจริงๆ
informatik01

18

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

ความแตกต่างที่สำคัญอื่น ๆ ได้แก่ :

  1. InnoDB รองรับธุรกรรมและกุญแจต่างประเทศ MyISAM ไม่ได้
  2. MyISAM ใช้การจัดทำดัชนีข้อความแบบเต็ม
  3. MyISAM ทำงานได้ไม่ดีในการบังคับใช้ความถูกต้องของข้อมูล

ออกจากวัน - InnoDB ตอนนี้มีและFULLTEXT SPATIALInnoDB เป็นสิ่งที่ดีสำหรับทั้งโหลด read- และเขียนหนัก
Rick James

8

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

  • การล็อคระดับแถว
  • การบังคับใช้กุญแจต่างประเทศ
  • สนับสนุนการทำธุรกรรม
  • ประสิทธิภาพเหนือขีด จำกัด บนระบบที่ใช้งานสูง

5
ยกเว้น MySQL รุ่นล่าสุดไม่ใช้ MyISAM เป็นเอ็นจิ้นเริ่มต้นอีกต่อไป ใน 5.5 พวกเขาเปลี่ยนค่าเริ่มต้นเป็น InnoDB :) และฉันจะไม่เห็นด้วยกับข้อสรุปทั่วไปที่ InnoDB โดยทั่วไปเพิ่งได้รับ ตาราง InnoDB ที่ออกแบบมาอย่างดีพร้อมการจัดทำดัชนีที่เหมาะสมและการตั้งค่าหน่วยความจำที่ตั้งค่าไว้อย่างดีสามารถทำให้ตาราง InnoDB ทำงานได้อย่างมีประสิทธิภาพเช่นเดียวกับสคีมาเดียวกันใน MyISAM
TechieGurl

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

2
การค้นหา FULLTEXT สำหรับ InnoDB ได้รับการเพิ่มเติมบางส่วนผ่านวงจรการพัฒนา MySQL 5.6 URL ที่อ้างถึงในตอนนี้ครอบคลุม InnoDB ด้วย
Max Webster

5

MyISAM

MYISAM ให้การล็อคระดับตารางการค้นหา FULLTEXT MYISAM มีคอลัมน์ AUTO_INCREMENTED ที่ยืดหยุ่นที่สุดในการจัดการกับเอ็นจิ้นการจัดเก็บทั้งหมด MYISAM ไม่รองรับการทำธุรกรรม

INNODB

INNODB เป็นเครื่องมือเก็บข้อมูลที่ปลอดภัย INNODB มีความสามารถในการคอมมิทย้อนกลับและการกู้คืนความผิดพลาด INNODB รองรับความสมบูรณ์ของการอ้างอิงคีย์ต่างประเทศ


5

รวมถึงการเปลี่ยนแปลงของ MySQL 5.6

เครื่องมือจัดเก็บ INNODB:

  • มันให้กรดเต็ม (atomicity, ความสอดคล้องการแยกความทนทาน) การใช้หลายรุ่นใช้เพื่อแยกธุรกรรมจากกัน
  • InnoDB ให้การกู้คืนอัตโนมัติหลังจากเกิดความผิดพลาดของเซิร์ฟเวอร์ MySQL หรือโฮสต์ที่เซิร์ฟเวอร์ทำงาน
  • InnoDB รองรับคีย์ต่างประเทศและความสมบูรณ์ของการอ้างอิงรวมถึงการลบและการปรับปรุงแบบเรียงซ้อน
  • MySQL 5.6 สร้างบนแพลตฟอร์มของ InnoDB แบบครบวงจรเป็นเครื่องมือจัดเก็บข้อมูลเริ่มต้น
  • สถิติของเครื่องมือเพิ่มประสิทธิภาพ Persistent : ให้ความแม่นยำที่ดีขึ้นของสถิติดัชนี InnoDB และความสอดคล้องในการรีสตาร์ท MySQL
  • การตัดแคชของตาราง InnoDB:เพื่อลดภาระหน่วยความจำในระบบที่มีตารางจำนวนมากตอนนี้ InnoDB จะเพิ่มหน่วยความจำที่เกี่ยวข้องกับตารางที่เปิด อัลกอริทึม LRU เลือกตารางที่ยาวที่สุดโดยไม่ต้องเข้าถึง
  • รองรับการค้นหาข้อความแบบเต็ม:ดัชนีชนิดพิเศษคือดัชนี FULLTEXT ช่วยให้ InnoDB จัดการกับข้อความค้นหาและการดำเนินการ DML ที่เกี่ยวข้องกับคอลัมน์แบบข้อความและคำที่มีอยู่ ดัชนีเหล่านี้แสดงทางร่างกายเป็นตาราง InnoDB ทั้งหมด
  • InnoDB ดูเหมือนจะเร็วกว่าในการค้นหาข้อความแบบเต็มกว่า MyISAM

ดังนั้นจึงไม่มีประเด็นในการใช้MyISAMEngine ถ้าคุณได้รับการอัพเกรดเป็น 5.6 แล้วถ้าไม่เช่นนั้นอย่ารอให้อัพเกรดเป็น MySQL 5.6

ประสิทธิภาพ InnoDB VS MyISAM โดยใช้ MySQL 5.6


2

MyISAM

MyISAM เป็นเครื่องมือเก็บข้อมูลสำหรับ MySQL ก่อน MySQL 5.5 มันเป็นเครื่องมือเก็บข้อมูลเริ่มต้นสำหรับ MySQL มันขึ้นอยู่กับเอ็นจิ้นการจัดเก็บ ISAM รุ่นเก่า MyISAM ได้รับการปรับให้เหมาะสมสำหรับสภาพแวดล้อมที่มีการดำเนินการอ่านจำนวนมากและมีการเขียนเพียงเล็กน้อยหรือไม่มีเลย เหตุผลที่ MyISAM อนุญาตให้อ่านอย่างรวดเร็วคือโครงสร้างของดัชนี: แต่ละรายการชี้ไปยังระเบียนในไฟล์ข้อมูลและตัวชี้ถูกชดเชยจากจุดเริ่มต้นของไฟล์ วิธีนี้สามารถอ่านระเบียนได้อย่างรวดเร็วโดยเฉพาะเมื่อรูปแบบถูกแก้ไข ดังนั้นแถวมีความยาวคงที่ พื้นที่ทั่วไปที่ใคร ๆ จะชอบ MyISAM คือ data warehouse เพราะมันเกี่ยวข้องกับการสืบค้นบนตารางที่มีขนาดใหญ่มากและการอัพเดทของตารางดังกล่าวจะเกิดขึ้นเมื่อฐานข้อมูลไม่ได้ถูกใช้งาน ส่วนแทรกก็ง่ายเช่นกันเนื่องจากแถวใหม่จะต่อท้ายไฟล์ข้อมูล อย่างไรก็ตาม การลบและอัปเดตการดำเนินการมีปัญหามากขึ้น: การลบจะต้องเว้นที่ว่างไว้มิฉะนั้นการชดเชยของแถวจะเปลี่ยนไป การอัพเดตจะเหมือนกันเมื่อความยาวของแถวสั้นลง ถ้าการปรับปรุงทำให้แถวยาวขึ้นแถวนั้นจะแยกส่วน เพื่อจัดเรียงแถวและเรียกร้องพื้นที่ว่าง,OPTIMIZE TABLEคำสั่งจะต้องดำเนินการ เนื่องจากกลไกอย่างง่ายนี้สถิติ MyISAM มักจะมีความแม่นยำ ข้อเสียที่สำคัญอื่น ๆ ของ MyISAM คือการขาดธุรกรรมสนับสนุนและกุญแจต่างประเทศ

InnoDB

InnoDB เป็นเครื่องมือเก็บข้อมูลสำหรับ MySQL MySQL 5.5 และใช้งานในภายหลังได้ตามค่าเริ่มต้น มันมีคุณสมบัติการทำธุรกรรมที่เป็นไปตามมาตรฐาน ACID พร้อมกับการสนับสนุนคีย์ต่างประเทศ (Integrity Referential Referential Declarative) ใช้ทั้งธุรกรรม SQL และ XA, พื้นที่ตาราง, FULLTEXTดัชนีและการดำเนินการเชิงพื้นที่ตามมาตรฐาน OpenGIS มันถูกรวมเป็นมาตรฐานในไบนารีส่วนใหญ่ที่แจกจ่ายโดย MySQL AB ยกเว้นในบางรุ่น OEM ซอฟต์แวร์นี้ได้รับอนุญาตให้ใช้งานคู่โดย Oracle Corporation; มันเผยแพร่ภายใต้สัญญาอนุญาตสาธารณะทั่วไปของกนู แต่ยังสามารถให้สิทธิ์แก่บุคคลที่ต้องการรวม InnoDB ในซอฟต์แวร์ที่เป็นกรรมสิทธิ์

งา

MariaDB มีเอ็นจิ้นการจัดเก็บข้อมูลที่เรียกว่า Aria ซึ่งได้รับการอธิบายว่าเป็น "ทางเลือกที่ปลอดภัยต่อการชนของ MyISAM" MariaDB และ Percona Server ใช้ทางแยกของ InnoDB ที่เรียกว่า XtraDB ตามค่าเริ่มต้น XtraDB ได้รับการดูแลโดย Percona การเปลี่ยนแปลงของ Oracle InnoDB จะมีการนำเข้าสู่ XtraDB อย่างสม่ำเสมอและมีการแก้ไขข้อบกพร่องและคุณสมบัติเพิ่มเติมบางอย่าง

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