2013-04-30 71 views
6

Tôi đọc rằng MySQL 5.6 chỉ có thể lập chỉ mục the first 767 bytes của một varchar (hoặc các loại văn bản khác). Bộ ký tự giản đồ của tôi là utf-8, vì vậy mỗi ký tự có thể được lưu trữ tối đa 3 byte. Kể từ 767/3 = 255,66, điều này sẽ chỉ ra rằng độ dài tối đa cho một cột văn bản cần được lập chỉ mục trong 255 ký tự. Kinh nghiệm dường như xác nhận điều này như sau đi qua:chiều dài tối đa của vachar cho chỉ mục với InnoDB và UTF-8

create table gaga (
    val varchar(255), 
    index(val) 
) engine = InnoDB; 

Nhưng thay đổi định nghĩa của val-varchar(256) mang lại một "Error Code: 1071. rõ chìa khóa quá dài; chiều dài khóa tối đa là 767 byte".

Trong ngày này ở độ tuổi, giới hạn 255 ký tự có vẻ quá tệ, vì vậy: điều này có đúng không? Nếu đó là cách tốt nhất để có được những đoạn văn bản lớn hơn được lập chỉ mục với MySQL là gì? (Tôi có nên tránh nó không? Lưu trữ một SHA? Sử dụng một loại chỉ mục cơ sở dữ liệu khác?)

Trả lời

7

Mặc dù giới hạn có vẻ vô lý, nó làm cho bạn suy nghĩ nếu bạn thực sự cần chỉ mục cho một varchar dài cánh đồng. Ngay cả với 767 byte, kích thước chỉ mục tăng lên rất nhanh và cho một bảng lớn (nơi nó hữu ích nhất) có lẽ hầu như không phù hợp với bộ nhớ.

Từ phía bên kia, trường hợp thường xuyên nhất ít nhất là trong kinh nghiệm của tôi, nơi tôi cần phải lập chỉ mục một trường varchar dài là một ràng buộc duy nhất. Và trong tất cả những trường hợp đó, chỉ số tổng hợp của một số id nhóm và MD5 từ trường varchar là đủ. Vấn đề duy nhất là bắt chước collation không phân biệt dạng chữ (xem xét các charactes có dấu và không có dấu), mặc dù trong tất cả các trường hợp của tôi, tôi vẫn sử dụng phép đối chiếu nhị phân, vì vậy nó không phải là vấn đề.

UPD. Một trường hợp thường xuyên khác để lập chỉ mục một varchar dài là đặt hàng. Đối với trường hợp này, tôi thường xác định một trường phân loại được lập chỉ mục riêng biệt, đây là tiền tố 5-15 ký tự tùy thuộc vào phân phối dữ liệu. Đối với tôi, một chỉ số nhỏ gọn thích hợp hơn là đặt hàng không chính xác.

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