2009-07-20 33 views
54

MySQL lưu trữ trường varchar như thế nào? Tôi có thể giả định rằng mô hình sau đây đều là kích thước lưu trữ hợp lý:Kích thước varchar tối ưu cho MySQL là gì?

1,2,4,8,16,32,64,128,255 (max)

Một làm rõ qua ví dụ. Cho phép nói rằng tôi có một trường varchar 20 ký tự. Liệu MySQL khi tạo ra lĩnh vực này, về cơ bản dự trữ không gian cho 32 byte (không chắc chắn nếu họ là byte hay không) nhưng chỉ cho phép 20 được nhập vào?

Tôi đoán tôi lo lắng về việc tối ưu hóa dung lượng đĩa cho một bảng lớn.

+7

Tôi muốn chỉ ra rằng khi MySQL 5.0.3 varchar có thể lên trên 65.535 – joshtronic

Trả lời

46

Để trả lời câu hỏi, trên đĩa MySql sử dụng 1 + kích thước được sử dụng trong trường để lưu trữ dữ liệu (vì vậy nếu cột được khai báo varchar (45) và trường là "FooBar", nó sẽ sử dụng 7 byte trên đĩa, trừ khi tất nhiên bạn sử dụng bộ ký tự nhiều byte, ở đâu nó sẽ sử dụng 14 byte). Vì vậy, tuy nhiên bạn khai báo các cột của bạn, nó sẽ không tạo sự khác biệt về kết thúc lưu trữ (bạn nói rằng bạn đang lo lắng về tối ưu hóa đĩa cho một bảng lớn). Tuy nhiên, nó tạo sự khác biệt trong các truy vấn, vì VARCHAR được chuyển thành CHAR khi MySql tạo một bảng tạm thời (SORT, ORDER, vv) và nhiều bản ghi bạn có thể vừa với một trang, bộ nhớ càng ít và quét bảng của bạn càng nhanh được.

+0

hm? vì vậy, trên bộ mã đa byte nó ((kích thước) + 2)? – andyk

+3

Không, trên multibyte là (size * 2) + 1. –

+2

@Kris: Tôi tin rằng nó cũng có thể là (size * 3) + 1 hoặc thậm chí (size * 4) + 1, no? –

22

MySQL lưu trữ trường varchar dưới dạng bản ghi độ dài biến, với tiền tố một byte hoặc hai byte để biểu thị kích thước bản ghi.

Có một mẫu kích thước lưu trữ không thực sự tạo ra bất kỳ sự khác biệt nào về cách thức hoạt động của MySQL khi xử lý lưu trữ bản ghi độ dài thay đổi. Độ dài được chỉ định trong khai báo varchar (x) sẽ chỉ xác định độ dài tối đa của dữ liệu có thể được lưu trữ. Về cơ bản, một varchar (16) là không có đĩa-khôn ngoan hơn một varchar (128).

This manual page có giải thích chi tiết hơn.

Chỉnh sửa: Liên quan đến câu hỏi được cập nhật của bạn, câu trả lời vẫn như cũ. Một trường varchar sẽ chỉ sử dụng hết dung lượng trên đĩa làm dữ liệu bạn lưu trữ trong đó (cộng với một hoặc hai byte trên đầu). Vì vậy, nó không quan trọng nếu bạn có một varchar (16) hoặc một varchar (128), nếu bạn lưu trữ một chuỗi 10 ký tự trong nó, bạn sẽ chỉ sử dụng 10 byte (cộng với 1 hoặc 2) của không gian đĩa .

+30

Thực tế truy cập khôn ngoan nó tạo ra sự khác biệt rất lớn, vì khi MySql tạo kết quả đặt trong bộ nhớ nó biến nó thành ma trận, do đó nếu trường lớn nhất là 16 ký tự, nhưng trường được xác định là 128 ký tự, bạn phải phân bổ thêm 112 ký tự cho mỗi hàng. Điều này lãng phí rất nhiều bộ nhớ. –

+2

Bạn không chỉ phải phân bổ thêm 112 ký tự cho mỗi hàng trong bộ nhớ, nhưng bạn sẽ có rất nhiều bộ nhớ cache L1 bị bỏ sót khi mỗi hàng được lặp lại. Điều này được so sánh với một loại cột VARCHAR (16), nơi bạn có thể siết chặt nhiều hàng hơn với cột này vào bộ đệm ẩn tốc độ cao. –

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