ทำไมฉันถึงชอบ ALGORITHM = COPY ถึง ALGORITHM = INPLACE


16

ตั้งแต่ MySQL 5.6 แนะนำ DDL ออนไลน์ALTER TABLEคำสั่งสามารถเลือกที่จะมีALGORITHM=INPLACEหรือALGORITHM=COPYระบุก็ได้ ภาพรวมของ DDL ออนไลน์หมายเหตุที่โดยปกติINPLACEจะใช้ที่ใดก็ตามที่เป็นไปได้และหมายถึง (โดยที่ไม่เคยระบุว่าค่อนข้าง) ว่าINPLACEอัลกอริทึมที่มีราคาถูกกว่าCOPYหนึ่งคือ

ดังนั้นฉันจะต้องระบุเหตุผลอะไรALGORITHM=COPYในALTER TABLEแถลงการณ์?


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

หาก COPY เติมข้อมูลตั้งแต่เริ่มต้นแม้ว่าจะเป็นตัวเลือกที่ช้าตารางผลลัพธ์อาจทำงานได้ดีขึ้นเนื่องจากดัชนีมีการดีแฟรกต์
Dave Poole

@DavePoole ทฤษฎีที่ดี แต่ฉันสงสัยว่ามันเป็นเรื่องผิดปกติเนื่องจากOPTIMIZE TABLE(ซึ่งฉันเชื่อว่ามีการจัดเรียงดัชนีเป็นส่วนใหญ่ของวัตถุประสงค์ ) ใช้ALGORITHM=INPLACEเป็นของ MySQL 5.7.4 ดังนั้นผมจึงคิดว่ามันเป็นกรณีที่ใช่COPY ไม่ดัชนีการ defrag แต่เพื่อไม่INPLACE (อย่างใด) nullifying COPYว่ามันเป็นข้อได้เปรียบที่มีศักยภาพของ
มาร์ค Amery

2
"ตาราง InnoDB ที่สร้างขึ้นก่อน MySQL 5.6 ไม่สนับสนุนALTER TABLE ... ALGORITHM=INPLACEตารางที่มีคอลัมน์ชั่วคราว (DATE, DATETIME หรือ TIMESTAMP) และยังไม่ได้ถูกสร้างใหม่โดยใช้ALTER TABLE ... ALGORITHM=COPY" ... ข้อ จำกัด ของ Online DDL
JSapkota

คำตอบ:


10

ใช่มีกรณีเมื่อคุณอาจระบุCOPYแต่มันจะเป็นด้วยเหตุผลอื่นนอกเหนือประสิทธิภาพ

สิ่งสำคัญคือต้องเข้าใจว่า MySQL แนะนำคุณสมบัติใหม่ - การประมวลผล DLL ออนไลน์ในรุ่น 5.6 มันไม่ได้ลบการประมวลผลออฟไลน์ ดังนั้นจึงจำเป็นต้องแยกความแตกต่างระหว่าง 2 โหมดนี้:

  1. การทำงานบางอย่างยังคงทำงานในโหมดออฟไลน์เท่านั้น ดูตาราง 15.10“ สรุปสถานะออนไลน์สำหรับการปฏิบัติการ DDL ” สำหรับรายการการดำเนินการ DDL ที่สามารถหรือไม่สามารถดำเนินการได้

  2. การทำงานในโหมดออนไลน์และออฟไลน์มีพฤติกรรมแตกต่างกันเล็กน้อยดังนั้นคุณสามารถเลือก "เก่า" เพื่อเหตุผลด้านความเข้ากันได้

ตัวอย่างบางส่วน (โปรดแนะนำเพิ่มเติม):

  1. ตาราง InnoDB สร้างขึ้นก่อน MySQL 5.6 ไม่สนับสนุนALTER TABLE ... ALGORITHM=INPLACEสำหรับตารางที่มีคอลัมน์ชั่วคราว ( DATE, DATETIMEหรือTIMESTAMP) ALTER TABLE ... ALGORITHM=COPYและยังไม่ได้รับการสร้างขึ้นมาใหม่โดยใช้ ในกรณีนี้การALTER TABLE ... ALGORITHM=INPLACEดำเนินการส่งคืนข้อผิดพลาด

  2. ADD PRIMARY KEYข้อในการCOPY modeแปลงเงียบNULLไปเป็นค่าเริ่มต้นสำหรับชนิดข้อมูลนั้น (0 สำหรับ INT สตริงว่างสำหรับ varchar) ในขณะที่IN_PLACEไม่ทำอย่างนั้น

ด้วย ALGORITHM = ส่วนคำสั่งการดำเนินการสำเร็จแม้จะมีค่า NULL ในคอลัมน์คีย์หลัก ข้อมูลถูกเปลี่ยนแปลงอย่างเงียบ ๆ ซึ่งอาจทำให้เกิดปัญหา

อีกเหตุผลที่ชอบCOPY:

การดำเนินการที่คุณระบุ ALGORITHM = COPY หรือ old_alter_table = 1 เพื่อบังคับใช้พฤติกรรมการคัดลอกตารางหากจำเป็นสำหรับความเข้ากันได้แบบย้อนหลังที่แม่นยำในสถานการณ์เฉพาะ

แม้ว่าคู่มือ MySQL จะไม่พูดถึงสถานการณ์จริง แต่คุณสามารถจินตนาการได้ นักพัฒนาเช่นอาศัยตารางที่ถูกล็อคในระหว่างALTER INDEXการดำเนินการเพื่อให้ตารางเป็นแบบอ่านอย่างเดียวหรือล็อกอย่างเต็มที่และมีกระบวนการที่อ่านตารางแบบคงที่ในระหว่างการสร้างดัชนีใหม่


1
ฉันคิดว่าผู้คนมักจะสับสนALGORITHM=INPLACEกับ "นี่คือ Online DDL และจะไม่ล็อคฐานข้อมูล" ในความเป็นจริงพวกเขาต้องการใช้งานLOCK=NONEจริง
เบรนแดนเบิร์ด

2

@ Stoleg อาจมีคำตอบที่ดีที่สุด แต่นี่เป็นอีกคำตอบหนึ่ง มันเดาการศึกษาว่านักพัฒนาที่เหลือในฐานะผู้หนีออกจากไข่ในกรณีที่มีข้อผิดพลาดร้ายแรงใน=COPY =INLINEสิ่งนี้จะช่วยให้ผู้ใช้ยังคงใช้งานต่อไปALTERแม้ว่าคุณสมบัติใหม่จะใช้งานไม่ได้

ฉันได้เห็นสิ่งต่าง ๆ เช่นนี้ (ในธงsql_mode, my.cnfการตั้งค่า ฯลฯ ) ในช่วงหลายปีที่ผ่านมา ความตั้งใจของรุ่นใหม่นั้นชัดเจนเพื่อนำเสนอคุณสมบัติใหม่ที่ดีกว่าออกมา

การเพิ่มประสิทธิภาพตั้งค่าสถานะตกอยู่ในหมวดหมู่นี้ แต่มีเหตุผลมากขึ้นที่จะยึดติดกับการกระทำก่อนหน้านี้ - เครื่องมือเพิ่มประสิทธิภาพมักจะ "ทำผิด" บางครั้ง; มีความเป็นไปได้มากเกินไป


1
ทำไมคุณถึงเรียกมันว่า "escape hatch" มากกว่า "ความเข้ากันได้แบบย้อนหลัง"? แม้ว่าอาจจะไม่แตกต่างกันมาก)
Stoleg

1
ฉันจะพูดว่า "ความเข้ากันได้ย้อนหลัง" ถ้าฉันต้องการรหัสเดียวกันเพื่อทำงานกับทั้งสองรุ่น แต่ฉันจะกังวลว่าจะมีการจดจำไวยากรณ์ใหม่โดยเวอร์ชันเก่าหรือไม่
Rick James

-1

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

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