วิธีการตั้งค่าฐานข้อมูล MySQL/MariaDB เพื่อแปลงตาราง InnoDB เป็นตาราง MyISAM แบบเป็นชุด?

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

ทำไมคนถึงอยากเปลี่ยนจาก InnoDB ไปใช้ MyISAM?

ในหลายสถานการณ์ MyISAM จะเร็วกว่า โดยเฉพาะอย่างยิ่งสำหรับแอปพลิเคชันที่เน้นการอ่านและการเขียนข้อมูลน้อย เช่น ฐานข้อมูลบันทึกและสถิติ

กลไกการล็อกระดับตารางของระบบนี้ทำงานได้อย่างราบรื่นมากภายใต้สภาวะการใช้งานพร้อมกันในระดับต่ำ

นอกจากนี้ ระบบจัดเก็บไฟล์ของ MyISAM ยังใช้งานง่ายกว่า; หนึ่ง .MYD จัดเก็บข้อมูลหนึ่งรายการ .MYI การจัดเก็บดัชนี การย้ายข้อมูล และการสำรองข้อมูล ล้วนสะดวกสบายมาก

อย่างไรก็ตาม การรองรับธุรกรรมและคีย์ต่างประเทศของ InnoDB ถือเป็นสิ่งจำเป็นอย่างยิ่งในสถานการณ์ทางธุรกิจที่ซับซ้อน

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

คำสั่งหลัก: ALTER TABLE

ในการแปลงตารางเดียวจาก InnoDB ไปยัง MyISAM คุณต้องการเพียงโค้ดบรรทัดเดียวเท่านั้น:

ALTER TABLE `你的表名` ENGINE = MyISAM;

หลังจากดำเนินการเสร็จสิ้น ระบบจะเปลี่ยนไปใช้เอนจินจัดเก็บข้อมูลอื่น

มันก็ตรงไปตรงมาไม่ใช่เหรอ?

การแปลงแบบกลุ่ม: การสร้างสคริปต์อัตโนมัติ

หากคุณมีตารางหลายสิบหรือหลายร้อยตาราง การแก้ไขตารางเหล่านั้นด้วยตนเองย่อมไม่สะดวกอย่างแน่นอน

ณ จุดนี้ สามารถใช้คำสั่งค้นหาเพียงคำสั่งเดียวเพื่อสร้างคำสั่งแปลงข้อมูลแบบกลุ่มโดยอัตโนมัติได้:

SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE = MyISAM;') 
FROM information_schema.tables 
WHERE table_schema = '你的数据库名' AND engine = 'InnoDB';

หลังจากรันเสร็จแล้ว จะแสดงผลลัพธ์ออกมามากมาย... ALTER TABLE ... คำแถลง.

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

นี่คือสิ่งที่เรียกว่า "การแปลงข้อมูลเป็นชุดอัตโนมัติ"

การประเมินความเสี่ยงก่อนการแปลงสภาพ

วิธีการตั้งค่าฐานข้อมูล MySQL/MariaDB เพื่อแปลงตาราง InnoDB เป็นตาราง MyISAM แบบเป็นชุด?

ข้อจำกัดคีย์ต่างประเทศ

InnoDB รองรับคีย์ต่างประเทศ ในขณะที่ MyISAM ไม่รองรับคีย์ต่างประเทศเลย

เมื่อแปลงเสร็จแล้ว ข้อจำกัดคีย์ต่างประเทศจะถูกละทิ้งไปโดยตรง

หากธุรกิจของคุณอาศัยการลบหรืออัปเดตแบบต่อเนื่อง ตรรกะดังกล่าวจะล้มเหลวโดยสิ้นเชิงหลังจากการแปลงข้อมูล

การสนับสนุนธุรกรรม

InnoDB มีระบบธุรกรรมและรองรับการทำธุรกรรม COMMIT และ ROLLBACK.

MyISAM ไม่รองรับธุรกรรม แต่รองรับเฉพาะการล็อกระดับตารางเท่านั้น

หลังจากการแปลงเสร็จสิ้น โค้ดที่เกี่ยวข้องกับการทำธุรกรรมทั้งหมดจะใช้การไม่ได้ และจะไม่สามารถย้อนกลับได้ในกรณีที่เกิดข้อผิดพลาด

ประสิทธิภาพการทำงานพร้อมกัน

InnoDB ใช้การล็อกระดับแถว ในขณะที่ MyISAM ใช้การล็อกระดับตาราง

ในสถานการณ์ที่มีการใช้งานพร้อมกันจำนวนมาก MyISAM มักจะล็อกตาราง ซึ่งนำไปสู่ปัญหาคอขวดด้านประสิทธิภาพ

คุณสมบัติของดัชนี

MySQL ก่อนเวอร์ชัน 5.6 MyISAM มีดัชนีข้อความเต็มรูปแบบเป็นของตัวเอง

แต่ใน MySQL การจัดทำดัชนีข้อความเต็มรูปแบบได้รับการสนับสนุนแล้วในเวอร์ชัน 5.6 และ 10 ขึ้นไปของ MariaDB และ InnoDB

ดังนั้น หากคุณไม่ได้ใช้เวอร์ชันเก่ากว่า ก็ไม่จำเป็นต้องเปลี่ยนไปใช้ MyISAM สำหรับการจัดทำดัชนีข้อความเต็มรูปแบบ

กระบวนการปฏิบัติที่ดีที่สุด

  1. สำรองข้อมูล ก่อนทำการแปลง โปรดตรวจสอบให้แน่ใจว่าได้ส่งออกข้อมูลแล้ว .sql ไฟล์ต่างๆ จะถูกจัดเก็บไว้เพื่อให้สามารถกู้คืนได้ทุกเมื่อ

  2. โครงสร้างรายการตรวจสอบ ใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่ามีคีย์ต่างประเทศอยู่หรือไม่:

    SHOW CREATE TABLE `你的表名`;
    
  3. ดำเนินการแปลง 使用 ALTER TABLE อีกทางเลือกหนึ่งคือ สามารถใช้สคริปต์แบบแบตช์เพื่อทำการแปลงให้เสร็จสมบูรณ์ได้

  4. ตรวจสอบสถานะสุขภาพ หลังจากการแปลงเสร็จสมบูรณ์แล้ว ให้เรียกใช้คำสั่งต่อไปนี้:

    CHECK TABLE `你的表名`;
    OPTIMIZE TABLE `你的表名`;
    

    สิ่งนี้ยืนยันว่าตารางทำงานได้อย่างถูกต้องและปล่อยส่วนต่าง ๆ ออกมา

วิธีการกู้คืนแบบย้อนกลับ

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

ALTER TABLE `你的表名` ENGINE = InnoDB;

นี่คือสิ่งที่เรียกว่า "การผ่าตัดที่สามารถย้อนกลับได้" ซึ่งทำให้คุณมีทางออก

อ้างอิงมุมมองที่น่าเชื่อถือ

ตามที่ เอกสารทางการของ MySQL คำอธิบาย:

"การสร้างคีย์ต่างประเทศ"aiInnoDB รองรับเฉพาะ nts เท่านั้น หากคุณแปลงตารางเป็น MyISAM คีย์ต่างประเทศทั้งหมดจะถูกละเว้น”
——คู่มืออ้างอิง MySQL บทที่ 14.6.6 ข้อจำกัดคีย์ต่างประเทศ

ข้อความนี้แสดงให้เห็นอย่างชัดเจนว่าคีย์ต่างประเทศนั้นใช้การไม่ได้โดยสิ้นเชิงใน MyISAM

และ เอกสารอย่างเป็นทางการของ MariaDB นอกจากนี้ยังมีการเน้นย้ำว่า:

"MyISAM ไม่รองรับธุรกรรม แอปพลิเคชันที่ต้องการความถูกต้องแม่นยำของธุรกรรมไม่ควรใช้ MyISAM"
——ฐานข้อมูลความรู้ของ MariaDB, เครื่องมือจัดเก็บข้อมูล

นั่นเป็นเหตุผลที่คุณต้องคิดให้ดีก่อนที่จะเปลี่ยนมาใช้ระบบอื่น

มุมมองและข้อสรุปของฉัน

การแปลง InnoDB เป็น MyISAM ก็เหมือนกับการเปลี่ยนเครื่องยนต์ของรถหรูเป็นเครื่องยนต์ของรถบรรทุก

มันสามารถทำงานได้ แต่ทำงานในรูปแบบที่แตกต่างไปจากเดิมอย่างสิ้นเชิง

หากธุรกิจของคุณเกี่ยวข้องกับการสืบค้นข้อมูลทางสถิติที่ไม่ซับซ้อนมากนัก ความเร็วและความเรียบง่ายของ MyISAM อาจเหมาะสมกว่า

อย่างไรก็ตาม หากระบบของคุณพึ่งพาธุรกรรมและคีย์ต่างประเทศ การแปลงระบบเหล่านั้นอย่างไม่รอบคอบก็เหมือนกับการถอดถุงลมนิรภัยออก

ดังนั้น ปัญญาที่แท้จริงจึงไม่ได้อยู่ที่การไล่ตามความเร็วอย่างไม่ลืมหูลืมตา แต่เป็นการสร้างสมดุลระหว่างความมั่นคงและประสิทธิภาพ

การเลือกใช้ฐานข้อมูลเป็นตัวกำหนดหัวใจสำคัญของระบบ

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

หากคุณกำลังพิจารณาการแปลงข้อมูลจำนวนมาก โปรดทำการประเมินความเสี่ยงอย่างครอบคลุมก่อน

เรียกใช้งานสภาพแวดล้อมทดสอบหนึ่งครั้งเพื่อจำลองสถานการณ์ทางธุรกิจจริง

หลังจากตรวจสอบแล้วว่าทุกอย่างถูกต้อง ให้รันคำสั่งในสภาพแวดล้อมการใช้งานจริง

ฐานข้อมูลไม่ใช่ของเล่น แต่เป็นหัวใจสำคัญของข้อมูลในองค์กร

และคุณคือผู้ที่ควบคุมจังหวะการเต้นของหัวใจของคุณเอง

หวัง Chen Weiliang บล็อก ( https://www.chenweiliang.com/ บทความเรื่อง "วิธีการแปลงตาราง InnoDB เป็นตาราง MyISAM ในฐานข้อมูล MySQL/MariaDB แบบเป็นชุด" ที่แชร์ไว้ที่นี่ อาจเป็นประโยชน์สำหรับคุณ

ยินดีต้อนรับสู่การแบ่งปันลิงค์ของบทความนี้:https://www.chenweiliang.com/cwl-34157.html

หากต้องการปลดล็อคเคล็ดลับที่ซ่อนอยู่เพิ่มเติม ยินดีต้อนรับเข้าร่วมช่อง Telegram ของเรา!

แชร์และกดไลค์ถ้าคุณชอบ! การแชร์และการถูกใจของคุณคือแรงบันดาลใจอย่างต่อเนื่องของเรา!

 

发表评论

ที่อยู่อีเมลของคุณจะไม่ถูกเผยแพร่ 必填项已用 * 标注

ไดเรกทอรีบทความ
เลื่อนไปที่ด้านบน