2011-11-24 38 views
6

Tôi có một bảng các trang web, với khóa chính là mã băm của URL và cột ID auto_increment, cũng là một khóa duy nhất.Kích thước bước tự động MySQL được xác định là

Điều tôi hơi bối rối là lý do chèn liên tiếp không tăng trường ID lên 1. Khi lần đầu tiên tôi tạo bảng và thực hiện một lần chèn, id đầu tiên là 1. Chèn thứ hai được tạo và id của 5 và thứ ba là 8.

Tôi có trình kích hoạt trên bảng, khi chèn, tính toán giá trị băm của URL của trang web. Bạn không chắc liệu điều đó có liên quan hay không.

Nó không phải là một vấn đề để có những khoảng trống, nhưng tôi muốn hiểu tại sao chèn liên tiếp không tạo ID với kích thước bước 1.

cảm ơn!

+0

bạn có thể đăng mã kích hoạt không? –

Trả lời

8

Một số đề xuất về lý do điều này có thể xảy ra:

Xem auto_increment_increment. Điều này kiểm soát sự gia tăng mỗi lần một giá trị mới được yêu cầu trong khi INSERT.

Ngoài ra nếu bạn sử dụng các bảng InnoDB trong MySQL 5.1, chúng optimized auto-inc allocation sao cho nó khóa bảng trong một thời gian ngắn hơn. Điều này là tốt cho đồng thời, nhưng nó cũng có thể "mất" giá trị auto-inc nếu INSERT của một hàng xung đột với một ràng buộc khác như cột UNIQUE thứ cấp hoặc khóa ngoài. Trong những trường hợp đó, giá trị auto-inc được cấp phát không được đẩy trở lại vào hàng đợi, bởi vì chúng ta giả sử một luồng đồng thời khác có thể đã được cấp phát giá trị auto-inc tiếp theo.

Tất nhiên các lần xuất hiện cũng sẽ xảy ra, trong trường hợp đó, giá trị tự động inc có thể được phân bổ nhưng bị hủy.

+0

Cảm ơn Bill. Tôi chơi xung quanh với nó nhiều hơn một chút và có vẻ như đó là các mục trùng lặp gây ra những khoảng trống (theo đó tôi có nghĩa là cố gắng để làm một chèn với một khóa chính trùng lặp). Khi thực hiện thu thập thông tin lại các trang web (để cập nhật nội dung động), điều này có thể sẽ để lại một vài khoảng trống. Tôi cho rằng đó không phải là một vấn đề lớn, miễn là tôi không hết các giá trị số nguyên! :) –

+2

Tôi đã thực hiện một số tư vấn vào đầu năm nay cho một trang web đã hết giá trị trong khóa chính nguyên 32 bit do vấn đề này. Họ đã có một cột UNIQUE thứ hai đã gây ra chèn để thất bại 1000 lần cho mỗi 1 thành công. Vì vậy, giá trị auto-inc của họ đã tăng lên hàng trăm, và bởi số tiền lớn hơn các hàng họ có (nhiều cơ hội hơn cho các bản sao). Chúng tôi đã phải ALTER TABLE để thay đổi khóa chính của họ thành BIGINT (cùng với các cột khóa ngoài trong 30 bảng phụ thuộc). –

+1

'BIẾN ĐỔI PHIÊN BẢN HIỂN THỊ;' để xem giá trị hiện tại của auto_increment_increment –

3

Nó có thể liên quan đến các giao dịch mà cuối cùng sẽ được khôi phục. Ví dụ,

  1. Chèn google.com id = 5
  2. Chèn mysql.com id = 6
  3. Chèn stackoverflow.com id = 7
  4. rollback chèn google.com
  5. rollback chèn mysql .com

Sau đó, stackoverflow.com được chèn với id = 7 và 5 và 6 được để trống.

1

Tăng tự động luôn bằng các bước 1, nhưng khi một hàng bị xóa, ID sẽ không được giải phóng.

ID tăng tự động tiếp theo được lưu trữ trong cơ sở dữ liệu lược đồ thông tin trong môi trường MySQL của bạn. Nó luôn luôn là +1 và khi một hàng bị xóa, ID ở giữa sẽ bị thiếu. Vì vậy, nếu đầu tiên là 1, và thứ hai (theo bạn) là 5, sau đó 2,3,4 đã được loại bỏ trong quá trình này.

Chạy truy vấn này để tìm hiểu, và thay thế 2 giá trị cuối cùng trong nơi;)

SELECT AUTO_INCREMENT 
from `information_schema`.`TABLES` 
WHERE TABLE_NAME = '<<YOUR TABLE NAME HERE>>' AND 
     TABLE_SCHEMA = '<< YOUR DATABASE NAME HERE >>' 
1

mysql.cnf/ini có thể thiết lập các thay đổi:

auto-increment-increment = 2 
auto-increment-offset = 1 

Trong một số cấu hình (ví dụ, để nhân bản chính/master), a_i có thể bỏ qua các số sử dụng các biến này.

Các vấn đề liên quan