Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Điều gì xảy ra khi tôi sử dụng hết khóa được tạo từ bigint? Làm thế nào để xử lý nó?

Nó sẽ không hết.

Bigint tối đa là 9223372036854775807. Với 1000 lần chèn / giây, tức là có giá trị 106751991167 ngày. Gần 300 triệu năm, nếu các phép toán của tôi là đúng.

Ngay cả khi bạn phân vùng nó ra, sử dụng hiệu số trong đó 100 máy chủ mỗi máy chủ có một phạm vi phụ dành riêng cho các giá trị (x*100+0 ... x*100+99 ), bạn sẽ không hết. 10.000 máy thực hiện 100.000 lần chèn / giây có thể đưa bạn đến đó trong khoảng ba thế kỷ. Tất nhiên, đó là nhiều giao dịch mỗi giây hơn so với Sở giao dịch chứng khoán New York trong hàng trăm năm ...

Nếu bạn làm vượt quá giới hạn kích thước kiểu dữ liệu của khóa được tạo, các lần chèn mới sẽ không thành công. Trong PostgreSQL (vì bạn đã gắn thẻ PostgreSQL này) với bigserial bạn sẽ thấy:

CREATE TABLE bigserialtest ( id bigserial primary key, dummy text );
SELECT setval('bigserialtest_id_seq', 9223372036854775807);
INSERT INTO bigserialtest ( dummy ) VALUES ('spam');

ERROR:  nextval: reached maximum value of sequence "bigserialtest_id_seq" (9223372036854775807)

Đối với một serial thông thường bạn sẽ gặp một lỗi khác vì sequence luôn là 64-bit, vì vậy bạn sẽ đến lúc phải thay đổi loại khóa thành bigint hoặc gặp lỗi như:

regress=# SELECT setval('serialtest_id_seq', 2147483647);
regress=# INSERT INTO serialtest (dummy) VALUES ('ham');
ERROR:  integer out of range

Nếu bạn thực sự tin rằng trang web của bạn có thể đạt đến giới hạn về bigint trong ứng dụng của mình, bạn có thể sử dụng khóa tổng hợp - giả sử (shard_id, subkey) - hoặc khóa uuid.

Cố gắng giải quyết vấn đề này trong một ứng dụng mới là việc tối ưu hóa quá sớm. Nghiêm túc mà nói, từ một ứng dụng mới đến kiểu tăng trưởng đó, bạn sẽ sử dụng cùng một lược đồ chứ? Hay công cụ cơ sở dữ liệu? Hay thậm chí là cơ sở mã?

Bạn cũng có thể lo lắng về xung đột GUID trong các hệ thống có khóa GUID. Xét cho cùng, nghịch lý ngày sinh có nghĩa là Xung đột GUID có nhiều khả năng hơn bạn nghĩ - cực kỳ khó tin, cực kỳ khó xảy ra.

Hơn nữa, như Barry Brown chỉ ra trong các nhận xét, bạn sẽ không bao giờ lưu trữ nhiều dữ liệu như vậy. Đây chỉ là mối lo ngại đối với các bảng có tỷ lệ giao dịch cao ngất ngưởng. Trong các bảng đó, ứng dụng chỉ cần có khả năng đối phó với khóa được đặt lại về 0, các mục nhập được đánh số lại hoặc các chiến lược đối phó khác. Thành thật mà nói, ngay cả một bảng hàng đợi tin nhắn có lưu lượng truy cập cao cũng sẽ không xuất hiện trên hết.

Xem:

Nghiêm túc mà nói, ngay cả khi bạn xây dựng Gootwitfacegram tiếp theo, điều này sẽ không thành vấn đề cho đến khi quá ngày sử dụng của lần viết lại ứng dụng thứ ba của bạn ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập dữ liệu nhanh chóng vào mysql trong Java

  2. Hiểu kết hợp tự nhiên trong SQL

  3. Lỗi cơ sở dữ liệu Codeigniter:1064 Sử dụng MySQL và có thể một số lỗi cấu hình phiên

  4. Làm cách nào để chọn hàng theo khóa chính, một hàng 'bên trên' và một hàng 'bên dưới' theo cột khác?

  5. Bảng tùy chỉnh Wordpress hoặc các loại bài đăng tùy chỉnh?