มี gotchas เลยด้วยการแปลงจาก MyISAM เป็น InnoDB?


11

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

คำตอบ:


7

นี่คือ gotchas บางส่วน

การใช้ความจำ

MyISAM

InnoDB

  • แคชหน้าข้อมูลและหน้าดัชนี
  • หนึ่งบัฟเฟอร์พูลและขนาดเดียวก่อน MySQL 5.5
  • บัฟเฟอร์พูล 1 หรือมากกว่าเริ่มต้นด้วย MySQL 5.5

นี่คือคำสั่งบางอย่างที่ผมเขียนและโพสต์ก่อนหน้านี้เกี่ยวกับวิธีการเลือกขนาดที่เหมาะสมสำหรับการแคชคีย์ MyISAM และ InnoDB บัฟเฟอร์สระว่ายน้ำเป็น

ดัชนี FULLTEXT

MyISAM

  • รองรับดัชนี FULLTEXT

InnoDB

MySQL 5.5 และย้อนกลับ

ในการค้นหาตาราง MyISAM ที่มีดัชนี FULLTEXT ให้เรียกใช้คิวรีนี้:

select tbl.table_schema,tbl.table_name from
(
    select table_schema,table_name
    from information_schema.tables
    where engine='MyISAM'
    and table_schema NOT IN ('information_schema','mysql')
) tbl
INNER JOIN
(
    select table_schema,table_name
    from information_schema.statistics
    where index_type='FULLTEXT'
) ndx
USING (table_schema,table_name);

สิ่งที่ออกมาจากแบบสอบถามนี้ไม่สามารถแปลงเป็น InnoDB จนกว่าคุณจะอัพเกรดเป็น MySQL 5.6

ปรับให้เหมาะสมตาราง

MyISAM

InnoDB


ขอบคุณสำหรับข้อความค้นหาพิมพ์ผิดเล็กน้อย: "engin" แทนที่จะเป็น "engine"
Andrew

@RolandoMySQLDBA: คุณสามารถเพิ่มได้ว่า InnoDB ไม่มีดัชนีเชิงพื้นที่
ypercubeᵀᴹ

2

ฉันคิดว่า gotcha ที่ใหญ่ที่สุดจะอยู่ที่ innodb ซึ่งเป็นธุรกรรม คุณจะต้องการทราบว่าไลบรารี MySQL ที่แอปพลิเคชันของคุณใช้อยู่เป็นค่าเริ่มต้นหรือไม่

ตัวอย่างเช่นPythonไม่ยอมรับอัตโนมัติ ซึ่งหมายความว่าหากแอปพลิเคชันแทรกแถวก่อนที่จะปิดการเชื่อมต่อที่แทรกจะถูกย้อนกลับหลังจากที่คุณเปลี่ยนเป็น Innodb สคริปต์ไพ ธ อนจะต้องแน่ใจว่าได้โทรไปที่ connection.commit ();

จุดที่แตกต่างก็คือรอบ ๆ แทรกหรืออัพเดตหลายแถว พิจารณาการแทรกหลายแถวเดียว

insert into tbl values (...row1...),  (...row2...),  (...rowN....);

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

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

พิจารณาข้อ จำกัด หน่วยความจำ / การจัดเก็บ Innodb เป็นทรัพยากรที่เข้มข้นกว่า MyISAM มาก หากคุณมี RAM เพียงพอที่จะทำให้พูลบัฟเฟอร์ของคุณมีขนาดใหญ่พอที่จะรองรับตารางทั้งหมดของคุณได้

ค้นหาตารางที่มีคีย์หลักขนาดใหญ่ การจัดทำดัชนีแบบกลุ่มของ Innodb หมายถึงดัชนีรองแต่ละรายการมีสำเนาของแถว PK ที่สอดคล้องกันอีกชุด หากคุณมีดัชนีรอง 2 อันหมายความว่าแต่ละแถว PK จะถูกเก็บไว้ 3 ครั้ง (PK + แต่ละดัชนี) หาก pk ครอบคลุมหลายคอลัมน์และประเภทข้อมูลขนาดใหญ่ (char (N)) คุณสามารถดูว่าข้อกำหนดของดัชนีสามารถระเบิดได้อย่างรวดเร็วได้อย่างไรภายใต้ innodb

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