Độ dài tối đa của chỉ mục Mysql varchar

Đôi khi, khi bạn đang xem lược đồ của cơ sở dữ liệu, bạn sẽ thấy rằng có các trường văn bản được định nghĩa như thế này

email_address varchar(191) NOT NULL

Điều này có nghĩa là cột hỗ trợ các chuỗi có độ dài tối đa là 191 ký tự và không thể là null. 191 là một số lẻ - nó đến từ đâu?

Câu hỏi đầu tiên bạn có thể hỏi là tại sao lại giới hạn độ dài của các chuỗi mà bạn có thể lưu trữ trong cơ sở dữ liệu?

Nếu bạn định tìm kiếm theo một cột, chẳng hạn như email_address, bạn có thể muốn thêm một chỉ mục vào cột đó để tăng tốc mọi thứ khi bạn thực hiện thao tác sau

select id from users where email = '[email protected]';

Khi bảng của bạn lớn hơn, các tìm kiếm sẽ chậm hơn vì cơ sở dữ liệu của bạn phải kiểm tra mọi hàng để tìm kết quả khớp. Tuy nhiên, nếu bạn thêm một chỉ mục tìm kiếm, về cơ bản, bạn đang yêu cầu cơ sở dữ liệu của mình "tính toán trước" các mẫu tìm kiếm phổ biến bằng một cây để tìm kiếm tiếp theo nhanh hơn nhiều. Về bản chất, các chỉ mục dành thời gian tính toán (và một ít dung lượng ổ đĩa) khiến việc ghi vào cơ sở dữ liệu chậm hơn, để tăng tốc độ đọc sau này. Đối với hầu hết các ứng dụng, đây là một sự cân bằng tuyệt vời, vì chúng "đọc nặng" và "viết nhẹ"

Vì vậy, tại sao lại sử dụng varchar? . Biết độ dài của các chuỗi trong chỉ mục là một trong những cách tốt nhất để tăng tốc mọi thứ. Đối với một số cơ sở dữ liệu, bạn không được phép thêm chỉ mục tìm kiếm vào các cột loại text vì không thể thực hiện việc tối ưu hóa này, trong khi ở những cơ sở dữ liệu khác, chỉ mục cũng sẽ không hoạt động tốt. Trên thực tế, trong lịch sử, cơ sở dữ liệu được xây dựng với các giới hạn về mức độ lớn của một chỉ mục để tối ưu hóa tìm kiếm và cách chúng lưu trữ dữ liệu trên đĩa

Ok, vì vậy các chỉ mục là tốt. Tuy nhiên, nhìn chung, có vẻ như một chỉ mục có kích thước bất kỳ sẽ hoạt động và mặc dù điều đó đúng ngày nay, nhưng không phải lúc nào cũng có thể. Điểm dừng tiếp theo trong hành trình của chúng ta là xem trước đây kích thước cột mặc định là bao nhiêu và đó là 255 ký tự, e. g

email_address varchar(255) NOT NULL

MySQL, cơ sở dữ liệu nguồn mở phổ biến nhất vào đầu những năm 2000 có giới hạn 255 ký tự trong các trường được lập chỉ mục. Lịch sử không rõ ràng về lý do tại sao MySQL chọn giới hạn 255 ký tự (xem các bài viết được liên kết bên dưới), nhưng các lý thuyết phổ biến nhất bao gồm

  • 256 là số lớn nhất bạn có thể biểu diễn bằng số nguyên 8 bit. MySQL rất quan tâm đến tốc độ và việc sử dụng bộ nhớ, muốn lưu trữ mọi thứ với các loại dữ liệu nhỏ nhất có thể
  • Bản thân MySQL đã cố gắng tương thích với các cơ sở dữ liệu cũ hơn (sybase/SAP) và chúng có giới hạn 255 ký tự
  • MySQL muốn đảm bảo rằng các tệp chỉ mục của nó có thể nằm gọn trong một khối trang duy nhất trên các hệ thống tệp cũ hơn

Với giới hạn 256 ký tự, các nhà phát triển MySQL cảm thấy thoải mái hơn nữa khi tối ưu hóa nhiều phần của cơ sở dữ liệu so với giới hạn 255 ký tự đó (sẽ nói thêm về điều này sau). Vì nhiều khung ứng dụng nguồn mở phổ biến đã ra mắt trong khoảng thời gian đó (Wordpress, Django và Rails, có thể kể tên một số), tất cả chúng đều tuân theo các giá trị mặc định của MySQL, ngay cả khi chúng có thể chạy trên nhiều loại cơ sở dữ liệu, như postgres. Điều này hình thành một mặc định chung cho hầu hết các ORM (Object–relational mapping - Wikipedia) để sử dụng varchar(255), bất kể cơ sở dữ liệu đang được sử dụng

255 có ý nghĩa hơn nhiều so với 191. Làm thế nào chúng ta đến được 191? . Nghiêm trọng. Chà, ít nhất là

select id from users where email = '[email protected]';
0, bộ ký tự cho phép các ký tự "quốc tế" và bao gồm biểu tượng cảm xúc đầu tiên. MySQL vào đầu những năm 2000 rất vui khi hỗ trợ 255 ký tự trong các cột varchar và lập chỉ mục cho chúng. Tuy nhiên, mã hóa văn bản phổ biến nhất (
select id from users where email = '[email protected]';
2 hoặc
select id from users where email = '[email protected]';
3 ) trên công cụ cơ sở dữ liệu MySQL phổ biến nhất (
select id from users where email = '[email protected]';
4) giả định rằng 3 byte là đủ để lưu trữ mọi ký tự và một khi
select id from users where email = '[email protected]';
0 xuất hiện cùng với các ký tự như 𠼭 và 🐟, thì cần 4 byte . Có nhiều ký tự hơn để lựa chọn, vì vậy việc tham chiếu chúng mất nhiều byte hơn

Cách thức hoạt động của cơ sở dữ liệu MySQL

select id from users where email = '[email protected]';
4 là bạn chỉ có thể có 767 byte cho một chỉ mục - đủ để lưu trữ 255 ký tự 3 byte (
select id from users where email = '[email protected]';
7). Đây là một ví dụ cực đoan về tối ưu hóa chỉ mục dựa trên việc biết kích thước của dữ liệu bạn đang lập chỉ mục. Vì vậy, nếu các ký tự chiếm nhiều không gian hơn để lưu trữ, thì số lượng ký tự bạn có thể lập chỉ mục phải nhỏ hơn. Cụ thể,
select id from users where email = '[email protected]';
8 ký tự. Khi có nhiều phần mềm hỗ trợ khán giả quốc tế hơn,
select id from users where email = '[email protected]';
9 đã thay thế varchar(255) làm mặc định. Đối với những ứng dụng phần mềm không cần hỗ trợ người dùng quốc tế, chúng cũng cần nâng cấp khi người dùng bắt đầu mong đợi hỗ trợ biểu tượng cảm xúc (thường liên quan đến sự gia tăng của điện thoại thông minh) vào đầu những năm 2010

Ngày nay, với cơ sở dữ liệu hiện đại, mã hóa ký tự như

select id from users where email = '[email protected]';
0 và các ký tự khác có thể hỗ trợ "tất cả" ký tự là mặc định và chỉ mục độ dài cố định đã là dĩ vãng. Tuy nhiên, chúng tôi vẫn có các mặc định 191 ký tự này trong nhiều ứng dụng để đảm bảo tính tương thích. Bất chấp điều đó, các chỉ mục vẫn hoạt động tốt nhất khi chúng biết kích thước của các chuỗi mà chúng đang so sánh, vì vậy chúng tôi vẫn muốn có một số giới hạn về độ dài cột của mình vì lý do tốc độ và nhờ vào lịch sử và quán tính, giới hạn 191 vẫn tồn tại với chúng tôi

Độ dài tối đa của VARCHAR trong MySQL là bao nhiêu?

Giá trị trong cột VARCHAR là chuỗi có độ dài thay đổi. Độ dài có thể được chỉ định dưới dạng giá trị từ 0 đến 65,535. Độ dài tối đa hiệu quả của VARCHAR tùy thuộc vào kích thước hàng tối đa ( 65.535 byte , được chia sẻ giữa tất cả các cột) và bộ ký tự được sử dụng. Xem Phần 8. 4.

VARCHAR 255 nghĩa là gì?

VARCHAR(255) lưu trữ 255 ký tự, có thể lớn hơn 255 byte .

Độ dài chỉ mục MySQL là gì?

Một bảng có thể chứa tối đa 64 chỉ mục phụ. Giới hạn độ dài tiền tố của khóa chỉ mục là 3072 byte cho các bảng InnoDB sử dụng định dạng hàng NĂNG ĐỘNG hoặc NÉN . Giới hạn độ dài tiền tố của khóa chỉ mục là 767 byte cho các bảng InnoDB sử dụng định dạng hàng REDUNDANT hoặc COMPACT.

Giới hạn của VARCHAR là gì?

varchar [ ( n. tối đa ) ] . 1 through 8,000, or use max to indicate a column constraint size up to a maximum storage of 2^31-1 bytes (2 GB).