2010-02-15 32 views
9

Tôi có một bản đồ từ chuỗi đến số nguyên. Để lưu trữ bản đồ này trong một cơ sở dữ liệu MySQL Tôi tạo ra bảng sau:Đây có phải là cách chính xác để lập chỉ mục cột TEXT của cơ sở dữ liệu MySQL không?

CREATE TABLE map(
    Argument TEXT NOT NULL, 
    Image INTEGER NOT NULL 
) 

tôi đã chọn loại TEXT cho lập luận vì chiều dài của nó là không thể đoán trước, hiện kỷ lục dài nhất có 2290 ký tự và chiều dài trung bình là 88 ký tự.

Sau khi tôi gặp các vấn đề về hiệu suất, tôi đã cố thêm chỉ mục vào cột Argument, nhưng thấy rằng tôi phải xác định độ dài, để tránh giới hạn này, tôi đã thêm một cột số nguyên mới chứa giá trị băm (md5 hoặc khác) Giá trị cột đối số.

ALTER TABLE map ADD COLUMN ArgumentHash INTEGER; 

Và kết hợp chỉ số

CREATE INDEX argument_index USING HASH ON map(ArgumentHash, Argument(80)); 

Kể từ thời điểm đó các vấn đề với hiệu suất đã biến mất. Tôi muốn hỏi xem đó có phải là cách chính xác để giải quyết vấn đề này hay không.

Trả lời

3

Tôi không nghĩ rằng có một cách "chính xác", nó phụ thuộc vào những gì bạn đang sử dụng cột cho.

Theo kinh nghiệm của tôi, việc chọn/chọn cột văn bản lớn là điều bất thường; văn bản thường là dữ liệu được truy xuất bởi một số khóa khác (trừ khi được lập chỉ mục theo một số cách khác - ví dụ: toàn văn, Lucene - nhưng điều đó dường như không phải là những gì bạn đang làm)

Nếu bạn thực sự cần chính xác phù hợp trên một lĩnh vực lớn, sau đó nó có thể hiệu quả hơn để sử dụng băm vì nó có khả năng sẽ cho phép bạn giữ cho chỉ mục nhỏ hơn. Tôi đoán là nếu bạn cần sử dụng kích thước chỉ mục lớn hơn kích thước của hàm băm (phụ thuộc vào mức độ gần bắt đầu của TEXT thì các giá trị thường khác nhau), hãy sử dụng hàm băm.

Đặt cược tốt nhất của bạn là thử và xem. Hồ sơ cả hai cách tiếp cận với dữ liệu đại diện và tìm hiểu.

+1

Tôi thấy rằng VARCHAR có thể là một loại cột tốt hơn để sử dụng cho các chỉ mục, vì VARCHAR, không giống TEXT, được lưu trữ nội tuyến và mang lại hiệu suất tốt hơn cho dữ liệu thường xuyên truy cập. http://stackoverflow.com/users/144287/brenton-alker –

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