2011-02-08 10 views
5

Tôi chỉ đọc câu trả lời được chấp nhận là this question, để lại cho tôi câu hỏi này.Có điểm nào trong việc sử dụng CHAR nếu bạn có VARCHAR trong cùng một bảng không?

Dưới đây là một trích dẫn từ câu trả lời rằng:

"Nhưng kể từ khi bạn gắn thẻ câu hỏi này với MySQL, tôi sẽ đề cập đến một mẹo MySQL cụ thể: khi truy vấn của bạn mặc nhiên tạo ra một bảng tạm thời, ví dụ khi sắp xếp hoặc GROUP BY Các trường VARCHAR được chuyển đổi thành CHAR để đạt được lợi thế khi làm việc với các hàng có chiều rộng cố định. Nếu bạn sử dụng rất nhiều trường VARCHAR(255) cho dữ liệu không cần nhiều thời gian, điều này có thể làm cho bảng tạm thời rất lớn. "

Như tôi đã hiểu, lợi thế của CHAR là bạn nhận được các hàng có chiều rộng cố định, do đó, không phải là VARCHAR trong cùng một bảng lộn xộn lên? Có lợi thế nào khi sử dụng CHAR khi bạn có một số VARCHAR trong cùng một bảng không?


Dưới đây là một ví dụ:

Bảng với CHAR:

CREATE TABLE address (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    street VARCHAR(100) NOT NULL, 
    postcode CHAR(8) NOT NULL, 
    PRIMARY KEY (id) 
); 

Bảng mà không CHAR:

CREATE TABLE address (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    street VARCHAR(100) NOT NULL, 
    postcode VARCHAR(8) NOT NULL, 
    PRIMARY KEY (id) 
); 

bảng với CHAR sẽ thực hiện bất kỳ tốt hơn so với bảng mà không CHAR và nếu có, trong những gì tình huống?

+0

Có thể trùng lặp - http://stackoverflow.com/questions/3408930/does-anyone-have-considerable-proof-that-char-is-faster-than-varchar – ocodo

+0

Bảng 'char' sẽ sử dụng ít không gian hơn, bởi vì nó không có trường thừa cho "độ dài của chuỗi mã bưu điện" trong mọi bản ghi. –

+0

@ Slomojo: Câu hỏi đó là về việc liệu có bất kỳ lợi thế nào của 'CHAR' chút nào và đó không phải là điều tôi đang yêu cầu. –

Trả lời

2

"VARCHAR" về cơ bản đặt độ dài tối đa cho trường và chỉ lưu trữ dữ liệu được nhập vào trường đó, do đó tiết kiệm được dung lượng. Loại "CHAR" có độ dài cố định, vì vậy nếu bạn đặt "CHAR(100)", giá trị khoảng 100 ký tự sẽ được sử dụng bất kể nội dung là gì.

Thời gian duy nhất bạn sẽ đạt được lợi thế về tốc độ là nếu bạn không có trường có độ dài thay đổi trong hồ sơ của mình ("VARCHAR", "TEXT", v.v ...). Bạn có thể nhận thấy rằng Nội bộ tất cả các trường "CHAR" của bạn được đổi thành "VARCHAR" ngay sau khi loại trường có độ dài biến được thêm vào, bởi MySQL.

Ngoài ra "CHAR" kém hiệu quả hơn từ điểm lưu trữ không gian, nhưng hiệu quả hơn để tìm kiếm và thêm. Nó nhanh hơn vì cơ sở dữ liệu chỉ phải đọc một giá trị bù đắp để có được một bản ghi thay vì đọc các phần cho đến khi nó tìm thấy phần cuối của bản ghi. Và các bản ghi độ dài cố định sẽ giảm thiểu phân mảnh, vì không gian bản ghi đã xóa có thể được sử dụng lại cho các bản ghi mới.

Hy vọng điều đó sẽ hữu ích.

+0

Bạn có nói rằng mã bưu điện sẽ được coi là 'VARCHAR' chỉ vì đường phố là' VARCHAR'? Điều này sẽ xảy ra trong nội bộ hay MySQL sẽ cho tôi biết rằng trường 'CHAR' của tôi bây giờ là một trường' VARCHAR'? –

+0

@Erik - Nó sẽ xảy ra trong nội bộ. Đã chỉnh sửa câu trả lời. –

+0

Tôi không có bằng chứng thực sự cho thấy những gì bạn đang nói là đúng, nhưng nó đã được bình chọn, nó có ý nghĩa và không ai phản đối, vì vậy tôi sẽ chấp nhận nó như là câu trả lời của tôi. –