Tại sao tôi lại thích ALGORITHM = COPY hơn ALGORITHM = INPLACE?


16

Do MySQL 5.6 giới thiệu DDL trực tuyến, nên ALTER TABLEtùy chọn có thể có ALGORITHM=INPLACEhoặc ALGORITHM=COPYđược chỉ định. Các tổng quan về DDL trực tuyến ghi chú rằng, theo mặc định, INPLACEđược sử dụng bất cứ nơi nào có thể, và ngụ ý (mà không bao giờ khá nêu nó) rằng INPLACEthuật toán là rẻ hơn so với COPYmột.

Vì vậy, lý do nào tôi sẽ phải chỉ định ALGORITHM=COPYtrên một ALTER TABLEtuyên bố?


Nếu bạn sử dụng COPY, điều gì xảy ra với các chỉ mục trên bảng? Bạn có kết thúc với các chỉ mục phân mảnh do một bảng mới được tạo và điền từ đầu không?
Dave Poole

Nếu COPY không cư trú từ đầu thì mặc dù đó là một tùy chọn chậm, bảng kết quả có thể hoạt động tốt hơn do các chỉ mục được phân mảnh.
Dave Poole

@DavePoole Lý thuyết hay, nhưng tôi nghi ngờ nó không đúng vì OPTIMIZE TABLE(mà tôi tin rằng có các chỉ số chống phân mảnh là một phần lớn trong mục đích của nó ) sử dụng ALGORITHM=INPLACEcho MySQL 5.7.4. Vì vậy, tôi nghĩ rằng đó là trường hợp, vâng, COPY không phân mảnh chỉ mục, nhưng cũng vậyINPLACE (bằng cách nào đó), vô hiệu hóa nó như là một lợi thế tiềm năng của COPY.
Đánh dấu Amery

2
"Các bảng InnoDB được tạo trước MySQL 5.6 không hỗ trợ ALTER TABLE ... ALGORITHM=INPLACEcho các bảng bao gồm các cột tạm thời (DATE, DATETIME hoặc TIMESTAMP) và chưa được xây dựng lại bằng cách sử dụng ALTER TABLE ... ALGORITHM=COPY" ... Hạn chế của DDL trực tuyến
JSapkota

Câu trả lời:


10

Vâng, có những trường hợp khi bạn có thể chỉ định COPY, nhưng nó sẽ vì những lý do khác ngoài hiệu suất.

Điều quan trọng là phải hiểu rằng MySQL đã giới thiệu tính năng mới - Xử lý DLL trực tuyến trong phiên bản 5.6. Nó không loại bỏ xử lý ngoại tuyến. Vì vậy, cần phải phân biệt giữa 2 chế độ này:

  1. Một số thao tác vẫn chỉ hoạt động ở chế độ Ngoại tuyến. Xem Bảng 15.10, Tóm tắt về tình trạng trực tuyến cho các hoạt động DDL . Để biết danh sách các hoạt động DDL có thể hoặc không thể được thực hiện tại chỗ.

  2. Các thao tác trong chế độ Trực tuyến và Ngoại tuyến có hành vi hơi khác nhau, vì vậy bạn có thể chọn "cũ" vì lý do tương thích.

Một số ví dụ (vui lòng đề xuất thêm):

  1. Bảng InnoDB tạo ra trước MySQL 5.6 không hỗ trợ ALTER TABLE ... ALGORITHM=INPLACEcho các bảng đó bao gồm các cột thời gian ( DATE, DATETIMEhoặc TIMESTAMP) và đã không được xây dựng lại sử dụng ALTER TABLE ... ALGORITHM=COPY. Trong trường hợp này, một ALTER TABLE ... ALGORITHM=INPLACEhoạt động trả về lỗi.

  2. ADD PRIMARY KEYmệnh đề trong COPY modeâm thầm chuyển đổi NULLthành các giá trị mặc định cho kiểu dữ liệu đó (0 cho INT, chuỗi rỗng cho varchar), trong khi IN_PLACEkhông làm điều đó.

Với mệnh đề ALGORITHM = COPY, thao tác thành công mặc dù có sự hiện diện của các giá trị NULL trong các cột khóa chính; dữ liệu được thay đổi âm thầm, có thể gây ra vấn đề.

Một lý do khác để thích COPY:

Các hoạt động mà bạn chỉ định ALGORITHM = COPY hoặc old_alter_table = 1, để buộc hành vi sao chép bảng nếu cần để tương thích ngược chính xác trong các tình huống chuyên biệt.

Mặc dù hướng dẫn sử dụng MySQL không nói về các kịch bản thực tế, bạn có thể tưởng tượng một số. Ví dụ: nhà phát triển đã dựa vào bảng bị khóa trong khi ALTER INDEXvận hành để bảng chỉ đọc hoặc bị khóa hoàn toàn và có một quy trình đọc bảng tĩnh trong quá trình xây dựng lại chỉ mục.


1
Tôi nghĩ mọi người cũng có xu hướng nhầm lẫn ALGORITHM=INPLACEvới "đây là DDL trực tuyến và sẽ không khóa cơ sở dữ liệu", trong khi thực tế, họ thực sự muốn sử dụng LOCK=NONE.
Brendan Byrd

2

@Stoleg có thể có câu trả lời tốt nhất, nhưng đây là một câu trả lời khác. Đó là một phỏng đoán có giáo dục rằng các nhà phát triển để lại =COPYnhư một lối thoát trong trường hợp có một lỗi nghiêm trọng =INLINE. Điều này sẽ cho phép người dùng tiếp tục sử dụng ALTERngay cả khi tính năng mới bị hỏng.

Tôi đã thấy những thứ như thế này (trong cờ sql_mode, my.cnfcài đặt, v.v.) trong nhiều năm qua. Mục đích của phiên bản mới rõ ràng là mang lại tính năng mới, tốt hơn.

Cờ tối ưu hóa rơi vào danh mục này, nhưng thậm chí còn có nhiều lý do hơn để treo vào các hành động trước đó - Trình tối ưu hóa sẽ luôn luôn "làm sai" đôi khi; đơn giản là có quá nhiều khả năng


1
Tại sao bạn gọi nó là "thoát nở" chứ không phải là "tương thích ngược"? Mặc dù có thể không có nhiều sự khác biệt;)
Stoleg

1
Tôi sẽ nói "khả năng tương thích ngược" nếu tôi cần cùng một mã để chạy trên cả hai phiên bản. Nhưng sau đó tôi sẽ lo lắng về việc liệu cú pháp mới có được phiên bản cũ nhận ra hay không.
Rick James

-1

Trong các phiên bản MySQL hỗ trợ mã hóa vùng bảng InnoDB, khi bạn thay đổi bảng để thêm mã hóa, việc thay đổi được thực hiện bằng thuật toán sao chép không cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.