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

Có sự khác biệt nào giữa varchar (10) và varchar (1000) khi chúng ta lưu trữ chuỗi có độ dài nhỏ hơn 10 không?

Điều này hoàn toàn phụ thuộc vào công cụ DBMS đang được sử dụng. Bản thân SQL không bắt buộc cách mọi thứ được lưu trữ vật lý, chỉ là cách chúng được nhìn thấy một cách hợp lý.

Ví dụ:DBMS của bạn có thể phân bổ không gian trong hàng cho kích thước tối đa, cộng thêm một số byte để lưu trữ độ dài. Trong trường hợp đó, sẽ có sự khác biệt lớn giữa varchar(10)varchar(1000) vì bạn sẽ lãng phí khá nhiều không gian cho mỗi hàng.

Ngoài ra, nó có thể sử dụng một vùng đệm cho varchar dữ liệu và chỉ lưu trữ độ dài và vùng đệm "địa chỉ bắt đầu" trong hàng. Trong trường hợp đó, mỗi hàng sẽ lưu trữ thông tin có kích thước giống hệt nhau cho một varchar bất kể kích thước của nó, nhưng sẽ có thêm một bước để trích xuất dữ liệu thực tế trong cột đó (theo liên kết đến vùng đệm).

Lý do bạn sử dụng varchar chính xác là tại sao nó được đặt tên là varchar . Nó cho phép bạn lưu trữ các phần tử dữ liệu có kích thước thay đổi. Thông thường, char(10) cung cấp cho bạn mười ký tự, không có vấn đề gì, hãy đệm nó bằng dấu cách nếu bạn chèn nội dung nào đó ngắn hơn. Bạn có thể cắt bớt khoảng trắng ở cuối khi giải nén nhưng điều đó sẽ không hiệu quả nếu dữ liệu bạn muốn lưu trữ thực sự là "hello " , với một khoảng trắng bạn muốn được giữ nguyên.

Một công cụ DBMS tốt có thể quyết định đánh đổi tùy thuộc vào kích thước tối đa của varchar cột. Đối với những cái ngắn, nó chỉ có thể lưu trữ nó nội dòng trong hàng và sử dụng thêm byte cho kích thước.

Dài hơn varchar các cột có thể được "thuê ngoài" vào một vùng đệm riêng biệt để đảm bảo việc đọc hàng được duy trì hiệu quả (ít nhất là cho đến khi bạn cần varchar lớn dù sao đi nữa).

Những gì bạn cần làm là đặt lại câu hỏi cho DBMS cụ thể của bạn để nhận được câu trả lời có mục tiêu hơn.

Hoặc, thành thật mà nói, hãy thiết kế cơ sở dữ liệu của bạn để chỉ lưu trữ kích thước tối đa. Nếu bạn biết đó là 10, thì varchar(1000) là một sự lãng phí. Nếu, trong tương lai, bạn cần phóng to cột, đó Đã đến lúc làm điều đó, thay vì bây giờ (xem YAGNI ).

Đối với MySQL, bạn sẽ muốn xem Chapter 14 Storage Engines của tài liệu trực tuyến.

Nó bao gồm các công cụ lưu trữ khác nhau (chẳng hạn như InnoDB và MyISAM) mà MySQL sử dụng và, nhìn đủ sâu, bạn có thể thấy thông tin được lưu trữ vật lý như thế nào.

Ví dụ:trong MyISAM, sự hiện diện của dữ liệu có độ dài thay đổi trong một bảng (varchar bao gồm) thường có nghĩa là bảng động . Điều này tuân theo một lược đồ gần giống với khái niệm vùng đệm mà tôi đã đề cập ở trên, với ưu điểm là ít không gian hơn bị lãng phí cho các cột có kích thước thay đổi và nhược điểm là các hàng có thể bị phân mảnh.

Định dạng lưu trữ khác (giảm định dạng nén vì nó chỉ thực sự được sử dụng cho các bảng chỉ đọc) là static một , nơi dữ liệu được lưu trữ trong một hàng vật lý.

Thông tin về cấu trúc vật lý InnoDB có thể được tìm thấy tại đây . Tùy thuộc vào việc bạn sử dụng định dạng tệp Antelope hay Barracuda, bạn sẽ gặp phải tình huống "tất cả thông tin là một hàng vật lý" hoặc "vùng đệm", tương tự như MyISAM phân biệt giữa động và tĩnh.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 Hàm trả về Tên tháng từ Ngày trong MySQL

  2. Chuyển đổi SQL sang SQL alchemy

  3. Giảm thời gian nâng cấp phiên bản AWS RDS

  4. Loại bỏ các hàng trùng lặp trong câu lệnh PostgreSQL SELECT

  5. PHP:tính ngày sinh theo tuổi