InnoDB และ MyISAM แตกต่างกันอย่างไร
InnoDB และ MyISAM แตกต่างกันอย่างไร
คำตอบ:
ความแตกต่างที่สำคัญอันดับแรกที่ฉันเห็นคือ InnoDB ใช้การล็อกระดับแถวในขณะที่ MyISAM สามารถล็อคระดับตารางได้เท่านั้น คุณจะพบการกู้คืนความผิดพลาดที่ดีขึ้นใน InnoDB อย่างไรก็ตามมันไม่มีFULLTEXT
ดัชนีการค้นหาจนถึง v5.6 เช่นเดียวกับ MyISAM InnoDB ยังใช้การทำธุรกรรมกุญแจต่างประเทศและข้อ จำกัด ด้านความสัมพันธ์ในขณะที่ MyISAM ไม่ทำเช่นนั้น
รายการสามารถไปอีกเล็กน้อย แต่พวกเขาทั้งสองมีข้อได้เปรียบที่ไม่ซ้ำกันในความโปรดปรานและข้อเสียของพวกเขาซึ่งกันและกัน แต่ละสถานการณ์มีความเหมาะสมกว่าในบางสถานการณ์
ดังนั้นเพื่อสรุป ( TL; DR ):
FULLTEXT
ดัชนีการค้นหา InnoDB ไม่ได้จนกว่า MySQL 5.6 (ก.พ. 2013)version 5.6.4
InnoDB รองรับการFULLTEXT
ค้นหา dev.mysql.com/doc/refman/5.6/th/fulltext-restrictions.html
ความแตกต่างที่สำคัญอีกอย่างที่ไม่ได้กล่าวถึงคือวิธีการแคชสำหรับเอ็นจินการเก็บข้อมูลแต่ละตัว
กลไกหลักที่ใช้คือแคชคีย์ มันจะแคชหน้าดัชนีจากไฟล์. 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 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) เพื่อความเรียบง่ายมีเพียงสองไฟล์บันทึกนี่คือวิธีที่คุณสามารถปรับขนาดไฟล์เหล่านี้:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(สร้างใหม่ ib_logfile0 และ ib_logfile1)ในตอนท้ายของคำสั่งทั้งเป็นอินไลน์แบบสอบถาม
(SELECT 2 PowerOf1024)
B
(SELECT 0 PowerOf1024)
ให้การตั้งค่าเป็นไบต์(SELECT 1 PowerOf1024)
ให้การตั้งค่าเป็นกิโลไบต์(SELECT 2 PowerOf1024)
ให้การตั้งค่าเป็นเมกะไบต์(SELECT 3 PowerOf1024)
ให้การตั้งค่าเป็นกิกะไบต์ไม่มีสิ่งใดทดแทนสามัญสำนึก หากคุณมีหน่วยความจำที่ จำกัด การผสมผสานของเอ็นจิ้นการจัดเก็บหรือการรวมกันของมันคุณจะต้องปรับให้เข้ากับสถานการณ์ต่าง ๆ
สถานการณ์ที่เป็นไปได้ไม่มีที่สิ้นสุด !!!
จำไว้ว่าอะไรก็ตามที่คุณจัดสรรให้ปล่อยให้ RAM เพียงพอสำหรับการเชื่อมต่อฐานข้อมูลและระบบปฏิบัติการ
ข้อเสนอ 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
ไม่ได้ใช้)MyISAM มีการล็อคระดับตาราง แต่ไม่มีการล็อคระดับแถว ไม่มีการทำธุรกรรม ไม่มีการกู้คืนความผิดพลาดโดยอัตโนมัติ แต่มีฟังก์ชันการซ่อมแซมตาราง ไม่มีข้อ จำกัด ของรหัสต่างประเทศ โดยทั่วไปแล้วตาราง MyISAM จะมีขนาดกะทัดรัดกว่าบนดิสก์มากกว่าเมื่อเปรียบเทียบกับตาราง InnoDB ตาราง MyISAM สามารถลดขนาดได้อีกมากโดยการบีบอัดด้วย myisampack หากจำเป็น แต่กลายเป็นแบบอ่านอย่างเดียว MyISAM เก็บดัชนีในไฟล์เดียวและข้อมูลในอีกไฟล์หนึ่ง MyISAM ใช้บัฟเฟอร์หลักสำหรับดัชนีการแคชและปล่อยให้การจัดการแคชข้อมูลอยู่ในระบบปฏิบัติการ
โดยรวมแล้วฉันจะแนะนำ InnoDB สำหรับวัตถุประสงค์ส่วนใหญ่และ MyISAM สำหรับการใช้งานเฉพาะเท่านั้น InnoDB เป็นเครื่องมือเริ่มต้นในรุ่น MySQL ใหม่
อีกอย่างหนึ่ง: คุณสามารถสำรองข้อมูลตาราง InnoDB เพียงแค่ถ่ายภาพระบบไฟล์ การสำรอง MyISAM จำเป็นต้องใช้ mysqldump และไม่รับประกันว่าจะสอดคล้องกัน (เช่นหากคุณแทรกลงในตารางผู้ปกครองและตารางลูกคุณอาจพบเฉพาะแถวของตารางลูกในการสำรองข้อมูลของคุณ)
โดยทั่วไปถ้าคุณมีสำเนาของข้อมูลอื่นและทำการแคชไว้ใน MySQL เท่านั้นเช่นอนุญาตให้ใช้วิธีมาตรฐานในการเข้าถึงจากเว็บไซต์ PHP ดังนั้น MyISAM ก็ใช้ได้ (เช่นดีกว่าไฟล์ CSV แบบแบนหรือไฟล์บันทึกการสืบค้นและ การเข้าถึงพร้อมกัน) หากฐานข้อมูลเป็น "สำเนาต้นแบบ" ที่แท้จริงของข้อมูลถ้าคุณกำลังทำINSERT
และUPDATE
ใช้ข้อมูลจริงจากผู้ใช้ก็เป็นเรื่องโง่ที่จะใช้สิ่งอื่นที่ไม่ใช่ InnoDB ในระดับใดก็ตามที่ MyISAM ไม่น่าเชื่อถือและจัดการได้ยาก จะทำmyisamchk
ครึ่งเวลาโดยไม่สนใจประสิทธิภาพที่เพิ่มขึ้น ...
(ประสบการณ์ส่วนตัวของฉัน: DB 2 เทราไบต์ใน MyISAM)
ช้าไปนิดหน่อยกับเกม ... แต่นี่เป็นโพสต์ที่ครอบคลุมมากฉันเขียนไปสองสามเดือนก่อนโดยให้รายละเอียดความแตกต่างที่สำคัญระหว่าง MYISAM และ InnoDB คว้าคัปป้า (และอาจเป็นบิสกิต) และเพลิดเพลิน
ความแตกต่างที่สำคัญระหว่าง MyISAM และ InnoDB คือการอ้างอิงที่สมบูรณ์และธุรกรรม นอกจากนี้ยังมีข้อแตกต่างอื่น ๆ เช่นการล็อกการย้อนกลับและการค้นหาข้อความแบบเต็ม
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 จะทำการกู้คืนอัตโนมัติผ่านการเล่นซ้ำของบันทึกเหล่านั้น
InnoDB ไม่รองรับการจัดทำดัชนี FULLTEXT จนกระทั่ง MySQL เวอร์ชั่น 5.6.4 จากการเขียนโพสต์นี้ผู้ให้บริการโฮสติ้งที่ใช้ร่วมกันหลายคนของ MySQL ยังคงต่ำกว่า 5.6.4 ซึ่งหมายความว่าการจัดทำดัชนี FULLTEXT ไม่ได้รับการสนับสนุนสำหรับตาราง InnoDB
อย่างไรก็ตามนี่ไม่ใช่เหตุผลที่ถูกต้องในการใช้ MyISAM เป็นการดีที่สุดที่จะเปลี่ยนเป็นผู้ให้บริการโฮสติ้งที่รองรับ MySQL เวอร์ชั่นล่าสุด ไม่ใช่ตาราง MyISAM ที่ใช้การทำดัชนี FULLTEXT ไม่สามารถแปลงเป็นตาราง InnoDB ได้
โดยสรุป InnoDB ควรเป็นเครื่องมือเก็บข้อมูลเริ่มต้นที่คุณเลือก เลือก MyISAM หรือชนิดข้อมูลอื่นเมื่อตอบสนองความต้องการเฉพาะ
จากประสบการณ์ของฉันความแตกต่างที่สำคัญที่สุดคือวิธีที่แต่ละเครื่องยนต์จัดการกับการล็อก InnoDB ใช้การล็อคแถวในขณะที่ MyISAM ใช้การล็อคตาราง ตามกฎทั่วไปฉันใช้ InnoDB เพื่อเขียนตารางหนักและ MyISAM สำหรับอ่านตารางหนัก
ความแตกต่างที่สำคัญอื่น ๆ ได้แก่ :
FULLTEXT
SPATIAL
InnoDB เป็นสิ่งที่ดีสำหรับทั้งโหลด read- และเขียนหนัก
ฉันมักจะมอง MyISAM เป็นตัวเลือกตาราง 'เริ่มต้น' สำหรับ MySQL ดังนั้นฉันจะชี้ให้เห็นความแตกต่างสำหรับผู้ใช้ส่วนใหญ่ของ InnoDB
MyISAM
MYISAM ให้การล็อคระดับตารางการค้นหา FULLTEXT MYISAM มีคอลัมน์ AUTO_INCREMENTED ที่ยืดหยุ่นที่สุดในการจัดการกับเอ็นจิ้นการจัดเก็บทั้งหมด MYISAM ไม่รองรับการทำธุรกรรม
INNODB
INNODB เป็นเครื่องมือเก็บข้อมูลที่ปลอดภัย INNODB มีความสามารถในการคอมมิทย้อนกลับและการกู้คืนความผิดพลาด INNODB รองรับความสมบูรณ์ของการอ้างอิงคีย์ต่างประเทศ
รวมถึงการเปลี่ยนแปลงของ MySQL 5.6
เครื่องมือจัดเก็บ INNODB:
ดังนั้นจึงไม่มีประเด็นในการใช้MyISAM
Engine ถ้าคุณได้รับการอัพเกรดเป็น 5.6 แล้วถ้าไม่เช่นนั้นอย่ารอให้อัพเกรดเป็น MySQL 5.6
MyISAM เป็นเครื่องมือเก็บข้อมูลสำหรับ MySQL ก่อน MySQL 5.5 มันเป็นเครื่องมือเก็บข้อมูลเริ่มต้นสำหรับ MySQL มันขึ้นอยู่กับเอ็นจิ้นการจัดเก็บ ISAM รุ่นเก่า MyISAM ได้รับการปรับให้เหมาะสมสำหรับสภาพแวดล้อมที่มีการดำเนินการอ่านจำนวนมากและมีการเขียนเพียงเล็กน้อยหรือไม่มีเลย เหตุผลที่ MyISAM อนุญาตให้อ่านอย่างรวดเร็วคือโครงสร้างของดัชนี: แต่ละรายการชี้ไปยังระเบียนในไฟล์ข้อมูลและตัวชี้ถูกชดเชยจากจุดเริ่มต้นของไฟล์ วิธีนี้สามารถอ่านระเบียนได้อย่างรวดเร็วโดยเฉพาะเมื่อรูปแบบถูกแก้ไข ดังนั้นแถวมีความยาวคงที่ พื้นที่ทั่วไปที่ใคร ๆ จะชอบ MyISAM คือ data warehouse เพราะมันเกี่ยวข้องกับการสืบค้นบนตารางที่มีขนาดใหญ่มากและการอัพเดทของตารางดังกล่าวจะเกิดขึ้นเมื่อฐานข้อมูลไม่ได้ถูกใช้งาน ส่วนแทรกก็ง่ายเช่นกันเนื่องจากแถวใหม่จะต่อท้ายไฟล์ข้อมูล อย่างไรก็ตาม การลบและอัปเดตการดำเนินการมีปัญหามากขึ้น: การลบจะต้องเว้นที่ว่างไว้มิฉะนั้นการชดเชยของแถวจะเปลี่ยนไป การอัพเดตจะเหมือนกันเมื่อความยาวของแถวสั้นลง ถ้าการปรับปรุงทำให้แถวยาวขึ้นแถวนั้นจะแยกส่วน เพื่อจัดเรียงแถวและเรียกร้องพื้นที่ว่าง,OPTIMIZE TABLE
คำสั่งจะต้องดำเนินการ เนื่องจากกลไกอย่างง่ายนี้สถิติ MyISAM มักจะมีความแม่นยำ ข้อเสียที่สำคัญอื่น ๆ ของ MyISAM คือการขาดธุรกรรมสนับสนุนและกุญแจต่างประเทศ
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 อย่างสม่ำเสมอและมีการแก้ไขข้อบกพร่องและคุณสมบัติเพิ่มเติมบางอย่าง