sách gpt4 ăn đã đi

详解MySQL自增主键的实现

In lại Tác giả: qq735679552 Thời gian cập nhật: 29-09-2022 22:32:09 36 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN này giải thích chi tiết cách triển khai khóa chính tăng tự động của MySQL, được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.

1. Giá trị tự tăng được lưu trữ ở đâu?

Các công cụ khác nhau có chiến lược lưu trữ khác nhau cho các giá trị tự tăng.

1. Giá trị tự tăng của công cụ MyISAM được lưu trong tệp dữ liệu.

2. Giá trị tự tăng của công cụ InnoDB Trong MySQL 5.7 và các phiên bản trước đó, giá trị tự tăng được lưu trong bộ nhớ và không được lưu giữ. Sau mỗi lần khởi động lại, khi mở bảng lần đầu tiên, bảng sẽ tìm giá trị tăng tự động tối đa max(id), sau đó sử dụng kích thước max(id)+step làm giá trị tăng tự động hiện tại của bảng.

?
1
lựa chọn tối đa (have_col) từ tên_bảng cập nhật ;

Trong MySQL phiên bản 8.0, những thay đổi về giá trị tự tăng được ghi lại trong nhật ký làm lại. Khi khởi động lại, nhật ký làm lại được dựa vào để khôi phục giá trị trước khi khởi động lại.

2. Cơ chế điều chỉnh giá trị tự gia tăng

Nếu id trường được xác định là AUTO_INCREMENT, khi chèn một hàng dữ liệu, hành vi tăng tự động như sau:

1. Nếu trường id được chỉ định là 0, null hoặc giá trị không xác định khi chèn dữ liệu thì hãy điền vào trường tăng tự động với giá trị AUTO_INCREMENT hiện tại của bảng này.

2. Nếu trường id chỉ định một giá trị cụ thể khi chèn dữ liệu, hãy sử dụng trực tiếp giá trị được chỉ định trong câu lệnh.

Giả sử giá trị được chèn là X và giá trị tăng tự động hiện tại là Y.

1. Nếu X

2. Nếu X>=Y, bạn cần sửa đổi giá trị tăng tự động hiện tại thành giá trị tăng tự động mới.

Thuật toán tạo giá trị tự tăng mới là: bắt đầu từ auto_increment_offset (giá trị ban đầu), lấy auto_increment_increment (kích thước bước) làm kích thước bước và tiếp tục chồng chất cho đến khi tìm thấy giá trị đầu tiên lớn hơn X, được sử dụng làm bản thân mới -giá trị gia tăng.

3. Điều chỉnh thời điểm giá trị tự tăng

Tạo bảng t, trong đó id là trường khóa chính tăng tự động và c là chỉ mục duy nhất. Câu lệnh tạo bảng như sau:

?
1
2
3
4
5
6
7
TẠO NÊN BÀN `t` (
   `mã số` số nguyên (11) KHÔNG VÔ GIÁ TRỊ TỰ ĐỘNG TĂNG,
   `c` số nguyên (11) MẶC ĐỊNH VÔ GIÁ TRỊ ,
   `d` số nguyên (11) MẶC ĐỊNH VÔ GIÁ TRỊ ,
   SƠ ĐẲNG CHÌA KHÓA (`id`),
   ĐỘC NHẤT CHÌA KHÓA `c` (`c`)
) ĐỘNG CƠ=InnoDB;

Giả sử rằng đã có một bản ghi (1,1,1) trong bảng t, sau đó thực hiện lệnh chèn dữ liệu:

?
1
chèn vào trong t giá trị ( vô giá trị , 1, 1);

Quá trình thực hiện như sau:

1. Người thực thi gọi giao diện công cụ InnoDB để ghi một hàng và giá trị của hàng được truyền vào là (0,1,1).

2. InnoDB tìm thấy một giá trị không chỉ định id tăng tự động và lấy giá trị tăng tự động 2 hiện tại của bảng t.

3. Thay đổi giá trị của hàng đến thành (2,1,1).

4. Thay đổi giá trị tăng tự động của bảng thành 3.

5. Tiếp tục chèn dữ liệu. Vì bản ghi có c=1 đã tồn tại nên lỗi khóa trùng lặp (xung đột khóa duy nhất) sẽ được báo cáo và câu lệnh sẽ trả về.

Sơ đồ luồng thực hiện tương ứng như sau:

详解MySQL自增主键的实现

Sau đó khi chèn dòng dữ liệu mới thì ID tự động tăng lên thu được là 3. Có một tình huống trong đó khóa chính tăng tự động không liên tục.

Xung đột khóa duy nhất và khôi phục giao dịch sẽ dẫn đến id khóa chính tự động tăng không liên tục.

4. Tối ưu hóa khóa tự tăng

Khóa ID tăng tự động không phải là khóa giao dịch mà được giải phóng ngay sau khi mỗi ứng dụng hoàn tất để cho phép các giao dịch khác áp dụng lại.

Nhưng trong MySQL phiên bản 5.0, phạm vi của khóa tự tăng là ở cấp độ câu lệnh. Nói cách khác, nếu một câu lệnh áp dụng cho khóa tăng tự động của bảng thì khóa sẽ không được giải phóng cho đến khi câu lệnh được thực thi.

MySQL phiên bản 5.1.22 giới thiệu một chiến lược mới, tham số mới innodb_autoinc_lock_mode, giá trị mặc định là 1.

1. Tham số này được đặt thành 0, có nghĩa là chiến lược của phiên bản MySQL 5.0 trước đó được áp dụng, nghĩa là khóa chỉ được giải phóng sau khi câu lệnh được thực thi.

2. Đặt tham số này thành 1.

  • Đối với các câu lệnh chèn thông thường, khóa tự tăng sẽ được giải phóng ngay sau khi áp dụng.
  • Đối với các câu lệnh như chèn...chọn chèn dữ liệu theo lô, khóa tăng tự động phải được giải phóng sau khi câu lệnh hoàn thành.

3. Tham số này được đặt thành 2. Tất cả các hành động áp dụng cho việc tự động tăng khóa chính sẽ giải phóng khóa sau khi ứng dụng.

Để nhất quán dữ liệu, cài đặt mặc định là 1.

详解MySQL自增主键的实现

Nếu sessionB giải phóng khóa tăng tự động ngay sau khi đăng ký tăng tự động thì tình huống sau có thể xảy ra:

  • sessionB lần đầu tiên chèn hai hàng dữ liệu (1,1,1), (2,2,2)
  • sessionA đã đăng ký ID tăng tự động và nhận được id=3, chèn (3,5,5)
  • Sau đó, sessionB tiếp tục thực thi và chèn hai bản ghi (4,3,3), (5,4,4)

Khi câu lệnh binlog_format=, hai phiên thực thi lệnh chèn dữ liệu cùng một lúc, do đó chỉ có hai trường hợp đối với nhật ký cập nhật của bảng t2 trong binlog: sessionA được ghi trước hoặc sessionB được ghi trước. Bất kể đó là cái nào, binlog này được thực thi từ cơ sở dữ liệu phụ hoặc được sử dụng để khôi phục một phiên bản tạm thời trong cơ sở dữ liệu dự phòng và phiên bản tạm thời, câu lệnh sessionB được thực thi và các ID trong kết quả được tạo là liên tục. Tại thời điểm này, sự không thống nhất dữ liệu xảy ra trong thư viện này.

Ý tưởng để giải quyết vấn đề này:

1) Để câu lệnh dữ liệu chèn hàng loạt của cơ sở dữ liệu gốc tạo ra các giá trị id liên tục. Do đó, khóa tự tăng không được giải phóng cho đến khi câu lệnh được thực thi để đạt được mục đích này.

2) Ghi lại các thao tác chèn dữ liệu một cách trung thực vào binlog Khi cơ sở dữ liệu dự phòng được thực thi, nó không còn dựa vào khóa chính tăng tự động để tạo. Tức là đặt innodb_autoinc_lock_mode thành 2 và binlog_format thành hàng.

Nếu có các tình huống chèn dữ liệu theo lô (chèn... chọn, thay thế... chọn và tải dữ liệu), từ góc độ hiệu suất chèn dữ liệu đồng thời, bạn nên đặt innodb_autoinc_lock_mode thành 2 và binlog_format thành hàng. đảm bảo tính đồng thời. Sẽ không có vấn đề về tính nhất quán của dữ liệu.

Đối với các câu lệnh chèn dữ liệu theo lô, MySQL có chiến lược ứng dụng hàng loạt cho các ID tăng tự động:

1. Trong quá trình thực thi câu lệnh, nếu bạn đăng ký ID tăng tự động lần đầu tiên, 1 sẽ được phân bổ.

Sau khi sử dụng hết 2.1, câu lệnh này sẽ áp dụng cho ID tăng tự động lần thứ hai và 2 sẽ được phân bổ.

Sau khi sử dụng hết 3.2, bảng kê này vẫn còn. Nếu bạn đăng ký ID tăng tự động lần thứ ba, 4 sẽ được phân bổ.

4. Tương tự, nếu bạn sử dụng cùng một câu lệnh để đăng ký ID tăng tự động thì số ID tăng tự động được áp dụng mỗi lần sẽ gấp đôi so với lần trước.

?
1
2
3
4
5
6
7
chèn vào trong t giá trị ( vô giá trị , 1,1);
chèn vào trong t giá trị ( vô giá trị , 2,2);
chèn vào trong t giá trị ( vô giá trị , 3,3);
chèn vào trong t giá trị ( vô giá trị , 4,4);
tạo nên bàn t2 giống t;
chèn vào trong t2(c,d) lựa chọn đĩa CD từ t;
chèn vào trong t2 giá trị ( vô giá trị , 5,5);

chèn...select thực sự chèn 4 hàng dữ liệu vào bảng t2. Tuy nhiên, bốn hàng dữ liệu này là ID tự tăng được áp dụng ba lần. Ứng dụng đầu tiên được gán id=1, lần thứ hai được gán id=2 và id=3 và lần thứ ba được gán id=4 cho id. = 7.

Vì câu lệnh này thực sự chỉ sử dụng 4 id nên id=5 đến id=7 sẽ bị lãng phí. Sau đó, thực hiện chèn vào các giá trị t2 (null, 5,5) và dữ liệu được chèn thực sự là (8,5,5).

Đây là lý do thứ ba khiến ID khóa chính có ID tăng tự động không liên tục.

5. Khóa chính tự động tăng đã dùng hết.

Sau khi trường khóa chính tự động tăng đạt đến giới hạn trên của loại đã xác định, nếu một hàng bản ghi khác được chèn vào, lỗi xung đột khóa chính sẽ được báo cáo.

Lấy số nguyên không dấu (4 byte, giới hạn trên là 2 32 − 1 2^{32}-1 232-1) làm ví dụ, hãy xác minh nó thông qua chuỗi câu lệnh sau:

?
1
2
3
TẠO NÊN BÀN t (tôi TỔNG QUAN Tự động tăng dần KHÔNG KÝ SƠ ĐẲNG CHÌA KHÓA ) tự động tăng = 4294967295;
CHÈN VÀO TRONG t GIÁ TRỊ ( VÔ GIÁ TRỊ );
CHÈN VÀO TRONG t GIÁ TRỊ ( VÔ GIÁ TRỊ );

Sau khi câu lệnh chèn đầu tiên chèn dữ liệu thành công, AUTO_INCREMENT của bảng không thay đổi (vẫn là 4294967295), khiến câu lệnh chèn thứ hai nhận được cùng một giá trị id tăng tự động, sau đó cố gắng thực thi câu lệnh chèn, báo cáo một giá trị chính lỗi xung đột phím.

Thông tin khuyến nghị:

https://time.geekbang.org/column/article/80531 。

Đến đây là kết thúc bài viết về phần giải thích chi tiết về cách triển khai khóa chính tăng tự động của MySQL. Để biết thêm thông tin về khóa chính tăng tự động của MySQL, vui lòng tìm kiếm các bài viết trước của tôi hoặc tiếp tục duyệt qua các bài viết liên quan bên dưới. trong tương lai! .

Liên kết gốc: https://blog.csdn.net/qq_40378034/article/details/90736544.

Cuối cùng, bài viết này về giải thích chi tiết về việc triển khai khóa chính tăng tự động của MySQL kết thúc tại đây. Nếu bạn muốn biết thêm về giải thích chi tiết về việc triển khai khóa chính tăng tự động của MySQL, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục. duyệt các bài viết liên quan tôi hy vọng bạn sẽ hỗ trợ tôi trong tương lai! .

36 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress