Bạn nên cố gắng xem một cột varchar giống như bạn xem một cột char trong hầu hết các trường hợp và đặt độ dài một cách thận trọng. Bạn không cần phải luôn nghĩ đến var modifier như một thứ ảnh hưởng đến việc đưa ra quyết định của bạn về độ dài tối đa. Nó thực sự nên được xem như một gợi ý hiệu suất thay vì các chuỗi được cung cấp sẽ có độ dài khác nhau.
Nó không phải là một chỉ thị phải được tuân thủ nghiêm ngặt bởi nội bộ cơ sở dữ liệu, nó có thể hoàn toàn bị bỏ qua. Tuy nhiên, hãy cẩn thận với điều này vì đôi khi việc triển khai có thể bị rò rỉ (ví dụ: chiều dài cố định và phần đệm) mặc dù nó không nên trong một thế giới lý tưởng.
Nếu bạn có varchar (255) thì bạn không có gì đảm bảo rằng hiệu suất khôn ngoan, nó sẽ luôn hoạt động khác với char (255) trong mọi trường hợp.
Có thể dễ dàng đặt nó ở một cái gì đó chẳng hạn như 255, 65535, v.v. theo lời khuyên được đưa ra trong sách hướng dẫn về yêu cầu lưu trữ. Điều này tạo ấn tượng rằng bất kỳ giá trị nào giữa 0 (vâng, đó là một điều) và 255 sẽ có cùng tác động. Tuy nhiên đó không phải là điều có thể được đảm bảo hoàn toàn.
Các yêu cầu lưu trữ có xu hướng đúng hoặc là một chỉ báo tốt cho các công cụ lưu trữ ổn định và trưởng thành về mặt lưu trữ hàng. Nó không phải là một chỉ báo mạnh cho những thứ như chỉ mục.
Đôi khi nó là một câu hỏi khó, chính xác thì một đoạn dây sẽ dài bao nhiêu để thiết lập nó thành giới hạn cao nhất mà bạn biết là nó phải ở trong đó nhưng điều đó không có tác động. Thật không may, đây thường là thứ để người dùng giải quyết và nó thực sự hơi tùy tiện. Bạn thực sự không thể nói không bao giờ vượt quá kích thước một chuỗi vì có thể có những trường hợp bạn không chắc chắn chính xác.
Bạn nên đảm bảo rằng các truy vấn MySQL phát ra lỗi khi một chuỗi quá dài thay vì cắt bớt để ít nhất bạn biết liệu nó có thể quá ngắn khi phát ra lỗi hay không. Thay đổi kích thước cột để phóng to hoặc thu nhỏ chúng có thể là một hoạt động DDL tốn kém, điều này cần được ghi nhớ.
Bộ ký tự cũng nên được xem xét khi độ dài và hiệu suất phát huy tác dụng. Độ dài đề cập đến điều này thay vì byte. Nếu sử dụng utf8 chẳng hạn, (không phải MB4) thì varchar (255) thực sự là varbinary (3 * 255). Thật khó để biết những thứ như thế này sẽ thực sự diễn ra như thế nào nếu không chạy các bài kiểm tra và tìm hiểu sâu về mã nguồn / tài liệu. Bởi vì điều này có phạm vi cho chiều dài quá mức để có tác động thổi phồng bất ngờ. điều này không chỉ áp dụng cho hiệu suất. Nếu một ngày nào đó bạn cần thay đổi bộ ký tự của cột varchar thành một cột lớn hơn thì bạn có thể đạt đến một giới hạn nào đó mà không cần truy đòi nếu bạn cho phép các chuỗi dài vô cớ xuất hiện mà điều này có thể tránh được. Đây bình thường là một vấn đề khá thích hợp nhưng nó sẽ xuất hiện,
Nếu nó chỉ ra rằng MAX (LENGTH (cột)) luôn <64 (chẳng hạn như nếu nó được quyết định sẽ có giới hạn về đầu vào không được khớp với định nghĩa cột) nhưng bạn có varchar (255) thì có một rất có thể bạn sẽ sử dụng dung lượng gấp bốn lần so với mức cần thiết trong một số trường hợp.
Điều này có thể bao gồm:
- Các động cơ khác nhau, một số có thể bỏ qua nó hoàn toàn.
- Kích thước bộ đệm, ví dụ cập nhật hoặc chèn có thể phải phân bổ 255 đầy đủ (mặc dù tôi chưa kiểm tra mã nguồn để chứng minh điều này, đó chỉ là giả thuyết).
- Chỉ mục, điều này sẽ rõ ràng ngay lập tức nếu bạn cố gắng tạo một khóa tổng hợp từ nhiều cột varchar (255).
- Bảng trung gian và có thể cả tập kết quả. Với cách thức hoạt động của giao dịch, có thể không phải lúc nào thứ gì đó cũng có thể sử dụng độ dài tối đa thực tế của các chuỗi trong một cột trái ngược với giới hạn đã xác định.
- Các tối ưu hóa dự đoán nội bộ có thể lấy độ dài tối đa làm đầu vào.
- Các thay đổi trong các phiên bản triển khai cơ sở dữ liệu.
Theo nguyên tắc chung, thực sự không cần một varchar dài hơn mức cần thiết, các vấn đề về hiệu suất hay không, vì vậy tôi khuyên bạn nên tuân theo điều đó khi bạn có thể. Cố gắng nhiều hơn để lấy mẫu kích thước dữ liệu của bạn, thực thi một giới hạn thực sự hoặc tìm ra giới hạn thực sự thông qua yêu cầu / nghiên cứu là cách tiếp cận lý tưởng.
Khi bạn không thể, nếu bạn muốn làm điều gì đó chẳng hạn như varchar (255) cho các trường hợp nghi ngờ thì tôi khuyên bạn nên làm theo khoa học. Điều này có thể bao gồm việc sao chép bảng, giảm kích thước của cột var char sau đó sao chép dữ liệu vào đó từ bản gốc và xem kích thước của dữ liệu chỉ mục / hàng (cũng lập chỉ mục cột, cũng có thể thử nó làm khóa chính. có thể hoạt động khác trong InnoDB vì các hàng được sắp xếp theo khóa chính). Ít nhất bằng cách này, bạn sẽ biết liệu bạn có tác động đến IO, vốn có xu hướng là một trong những nút thắt nhạy cảm nhất. Kiểm tra mức độ sử dụng bộ nhớ khó hơn, thật khó để kiểm tra toàn bộ. Tôi khuyên bạn nên thử nghiệm các trường hợp xấu nhất có thể xảy ra (các truy vấn có nhiều kết quả trung gian trong bộ nhớ, kiểm tra với giải thích cho các bảng tạm thời lớn, v.v.).
Nếu bạn biết rằng sẽ không có nhiều hàng trong bảng, bạn sẽ không sử dụng cột cho các phép nối, chỉ mục (đặc biệt là tổng hợp, duy nhất), v.v. thì rất có thể bạn sẽ không gặp nhiều vấn đề.
VARCHAR(255) utf8mb4
cột được lập chỉ mục với ~ 150 nghìn hàng được đo là 11,5 MB. Một bảng cóVARCHAR(48) utf8mb4
cột được lập chỉ mục có cùng dữ liệu (độ dài tối đa 46 ký tự) được sử dụng 4,5 MB. Không thực sự khác biệt lớn trong các truy vấn, nó được lập chỉ mục. Nhưng nó kết hợp với I / O truy vấn và những thứ như sao lưu cơ sở dữ liệu.