2012-02-21 38 views
30

Tôi đang cố gắng tìm hiểu xem bảng của tôi có nhận được ít hiệu suất hơn không nếu tôi thay đổi khóa chính thành BIGINT (20). Hiện tại, tôi đang sử dụng INT (7) và có khoảng 300.000 mục đã có với các ID lớn (7 hoặc 8 chữ số). Tôi đã tìm kiếm rất nhiều nhưng chỉ phát hiện ra rằng nó sử dụng nhiều không gian đĩa hơn (điều này hiển nhiên).Hiệu suất mysql BIGINT so với INT

Tất cả các ID của tôi có 7 chữ số ngay bây giờ, nhưng khách hàng của tôi muốn thay đổi thành 8 chữ số. Tôi sẽ không thể dễ dàng thay đổi phần mềm trong tương lai, vì vậy tôi đã nghĩ đến việc sử dụng BIGINT (20) ngay trong trường hợp. Nó sẽ ít hiệu quả hơn nếu tôi sử dụng BIGINT mặc dù tôi không cần phải làm sao?

Có ai có kinh nghiệm làm điều này có đề xuất về tốc độ và hiệu suất không?

Trả lời

81

Để trả lời câu hỏi của bạn: có, nó sẽ ít hiệu quả hơn. Rõ ràng, loại càng lớn, bảng càng lớn, các truy vấn càng chậm (càng nhiều I/O, các chỉ mục lớn hơn, thời gian truy cập dài hơn, kết quả ít có khả năng phù hợp với các bộ đệm khác nhau, vv). Vì vậy, theo nguyên tắc: luôn sử dụng loại nhỏ nhất phù hợp với nhu cầu của bạn.

Điều đó đang được nói, hiệu suất không quan trọng. Tại sao? Bởi vì khi bạn đạt đến một điểm mà bạn tràn INT, thì BIGINT là giải pháp duy nhất và bạn sẽ phải sống với nó. Cũng tại thời điểm đó (xem xét bạn đang sử dụng PK tăng tự động, bạn sẽ vượt quá 4 tỷ hàng hàng), bạn sẽ có vấn đề về hiệu suất lớn hơn và chi phí của BIGINT so với INT sẽ là ít nhất mối quan tâm của bạn.

Vì vậy, hãy xem xét những điểm sau đây:

  • sử dụng unsigned nếu bạn không cần giá trị âm, mà sẽ tăng gấp đôi giới hạn.
  • Giá trị tối đa INT UNSIGNED INT là 4.294.967.295. Nếu bạn đang sử dụng PK tăng tự động và bạn chỉ có 300.000 mục nhập, bạn thực sự không cần phải lo lắng. Bạn thậm chí có thể sử dụng MEDIUMINT vào lúc này, trừ khi bạn đang lập kế hoạch cho sự tăng trưởng thực sự rất nhanh. (xem http://dev.mysql.com/doc/refman/5.1/en/integer-types.html)
  • Số trong ngoặc đơn sau loại không ảnh hưởng đến giá trị tối đa của loại. INT (7) giống với INT (8) hoặc INT (32). Nó được sử dụng để cho biết chiều rộng màn hình tối đa. (xem http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html)
+3

Điều này nói mọi thứ tôi sắp sửa. Bạn có thực tế không có cơ hội nhấn giới hạn trên một lĩnh vực INT trừ khi bạn đang đối phó với rất nhiều dữ liệu (mà 300.000 mục là không). Cũng như đã đề cập ở đây (7) không thực sự làm bất cứ điều gì để hạn chế những gì các lĩnh vực cửa hàng. Bạn vẫn có giới hạn là 4,3 tỷ đồng (giả sử bạn làm cho nó KHÔNG ĐƯỢC KÝ) –

+0

tôi biết về kích thước của int (7) và vân vân. nhưng tôi không sử dụng tự động tăng trong bảng đó, gây ra các số được nhập từ cơ sở dữ liệu khác, và chúng dài hơn 2 ký tự – rubo77

+0

tôi đọc http://dev.mysql.com/doc/refman/5.1/en/numeric -type-overview.html :) – rubo77

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