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

Các phương pháp hay nhất cho độ dài cột SQL varchar

Không có DBMS nào mà tôi biết có bất kỳ "tối ưu hóa" nào sẽ tạo ra VARCHAR với 2^n chiều dài hoạt động tốt hơn chiều dài có max chiều dài không phải là lũy thừa của 2.

Tôi nghĩ rằng các phiên bản SQL Server đầu tiên thực sự xử lý VARCHAR có chiều dài 255 khác với chiều dài có chiều dài tối đa cao hơn. Tôi không biết nếu vẫn còn trường hợp này.

Đối với hầu hết tất cả DBMS, dung lượng lưu trữ thực tế được yêu cầu chỉ được xác định bởi số ký tự bạn đưa vào nó, không phải max độ dài bạn xác định. Vì vậy, từ quan điểm lưu trữ (và hầu hết có thể là một hiệu suất), không có bất kỳ sự khác biệt nào cho dù bạn khai báo một cột là VARCHAR(100) hoặc VARCHAR(500) .

Bạn sẽ thấy max độ dài được cung cấp cho một VARCHAR là một loại ràng buộc (hoặc quy tắc kinh doanh) chứ không phải là một thứ kỹ thuật / vật lý.

Đối với PostgreSQL, cách thiết lập tốt nhất là sử dụng text không giới hạn độ dài và CHECK CONSTRAINT giới hạn số lượng ký tự ở bất kỳ số lượng ký tự nào mà doanh nghiệp của bạn yêu cầu.

Nếu yêu cầu đó thay đổi, việc thay đổi ràng buộc kiểm tra nhanh hơn nhiều so với việc thay đổi bảng (vì bảng không cần phải viết lại)

Điều tương tự cũng có thể được áp dụng cho Oracle và các hãng khác - trong Oracle, nó sẽ là VARCHAR(4000) thay vì text Tuy nhiên.

Tôi không biết liệu có sự khác biệt về bộ nhớ thực giữa VARCHAR(max) hay không và v.d. VARCHAR(500) trong SQL Server. Nhưng dường như có tác động về hiệu suất khi sử dụng varchar(max) so với varchar(8000) .

Xem liên kết này (được đăng bởi Erwin Brandstetter dưới dạng bình luận)

Chỉnh sửa 2013-09-22

Về bình luận của bigown:

Trong các phiên bản Postgres trước 9.2 (không có sẵn khi tôi viết câu trả lời ban đầu), một thay đổi đối với định nghĩa cột did viết lại toàn bộ bảng, xem ví dụ: tại đây . Vì 9.2, điều này không còn đúng nữa và một thử nghiệm nhanh đã xác nhận rằng việc tăng kích thước cột cho một bảng có 1,2 triệu hàng thực sự chỉ mất 0,5 giây.

Đối với Oracle, điều này dường như cũng đúng, xét theo thời gian cần thiết để thay đổi varchar của một bảng lớn cột. Nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào cho điều đó.

Đối với MySQL, hướng dẫn sử dụng cho biết " Trong hầu hết các trường hợp, ALTER TABLE tạo bản sao tạm thời của bảng gốc ". Và các thử nghiệm của riêng tôi xác nhận rằng:chạy ALTER TABLE trên một bảng có 1,2 triệu hàng (giống như trong thử nghiệm của tôi với Postgres) để tăng kích thước của một cột mất 1,5 phút. Tuy nhiên, trong MySQL, bạn có thể không sử dụng "giải pháp thay thế" để sử dụng ràng buộc kiểm tra nhằm giới hạn số ký tự trong một cột.

Đối với SQL Server, tôi không thể tìm thấy tuyên bố rõ ràng về điều này nhưng thời gian thực thi để tăng kích thước của varchar (lại là bảng 1,2 triệu hàng từ trên) chỉ ra rằng không viết lại diễn ra.

Chỉnh sửa 2017-01-24

Có vẻ như tôi đã sai (ít nhất một phần) về SQL Server. Xem câu trả lời này từ Aaron Bertrand điều đó cho thấy rằng độ dài được khai báo của nvarchar hoặc varchar cột tạo ra sự khác biệt lớn cho hiệu suất.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Loại bỏ hoàn toàn MySQL 5.7

  2. BẢNG DROP MySQL

  3. MySQL - Lỗi kết nối - [MySQL] [ODBC 5.3 (w) Driver] Host ‘IP’ không được phép kết nối với máy chủ MySQL này

  4. Hàm chuyển đổi MySQL

  5. Làm cách nào để chọn giữa ngày đầu tiên của tháng hiện tại và ngày hiện tại trong MySQL?