2009-04-19 28 views

Trả lời

39

Có một hiệu suất rất lớn phạt để sử dụng ENUM cho các hoạt động như:

  • Query danh sách các giá trị cho phép trong ENUM, ví dụ để cư một trình đơn thả xuống. Bạn phải truy vấn kiểu dữ liệu từ INFORMATION_SCHEMA và phân tích cú pháp danh sách ra khỏi trường BLOB được trả lại.

  • Thay đổi tập hợp các giá trị được phép. Nó yêu cầu một tuyên bố ALTER TABLE, khóa bảng và có thể thực hiện tái cơ cấu.

Tôi không phải là người hâm mộ của MySQL ENUM. Tôi thích sử dụng bảng tra cứu hơn. Xem thêm câu trả lời của tôi cho "How to handle enumerations without enum fields in a database?"

+4

giá trị enum của tôi sẽ là những thứ như nhân khẩu học (W, B, A, H, O, U) Giới tính (M, F, U) và Bên (R, D, tôi, U) những thứ đó sẽ không bao giờ thay đổi. để chúng luôn có thể được mã hóa cứng vào logic ứng dụng của tôi. Vì vậy, truy vấn cho các giá trị thả xuống, và thay đổi cấu trúc không phải là lớn của một yếu tố. – gsueagle2008

+33

"giá trị enum của tôi ... sẽ không bao giờ thay đổi". Sẽ ** yêu ** để có được một số số liệu thống kê về bao nhiêu lần tuyên bố đã được chứng minh là sai. – benmarks

+2

Trong khi các dấu đầu dòng được liệt kê là đúng, ENUM vẫn nhanh hơn JOINS, đặc biệt nếu bạn đang sắp xếp theo cột đó. Đối với các cột như giới tính có giá trị đã đặt không thay đổi, tôi thích sử dụng ENUM. Nếu có ngay cả một khả năng từ xa mà bạn sẽ cần phải thêm hoặc loại bỏ các giá trị mặc dù, đi với một JOIN hoặc sử dụng một CHAR/VARCHAR/TINYINT và quản lý chúng ở cấp ứng dụng. Một điều khác ... MySQL không lưu trữ giá trị thực tế trong cột, chỉ một chỉ mục (INT), vì vậy bạn cũng có thể sử dụng chuỗi văn bản đầy đủ để hiển thị cho người dùng của bạn (ví dụ: Nam thay vì M) và lưu thêm mã hóa.;-) – Jabari

1

Không, xem so sánh here

Lợi thế đặt ở mức dễ đọc mã.

+10

Theo bài viết bạn đã liên kết, đó là lợi thế hiệu suất khi sử dụng ENUM miễn là bạn không thay đổi trạng thái có thể. –

24

ENUM được thể hiện bên trong bằng 1 hoặc 2 byte, tùy thuộc vào số lượng giá trị. Nếu các chuỗi bạn đang lưu trữ lớn hơn 2 byte và hiếm khi thay đổi, thì ENUM là cách để đi. So sánh sẽ nhanh hơn với một enum và chúng chiếm ít không gian trên đĩa, do đó có thể dẫn đến thời gian tìm kiếm nhanh hơn.

Nhược điểm là enums ít linh hoạt hơn khi nói đến việc thêm/xóa các giá trị.

+0

Tôi không chắc bạn đang đề cập đến phiên bản MySQL nào. Nhưng kể từ 5.0, kích thước của loại enum là 1 hoặc 2 byte phụ thuộc vào số lượng giá trị có thể theo hướng dẫn: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html Vì chỉ có 5 đến 10 giá trị có thể, kích thước phải là 1 byte – Lacek

+0

@Lacek Bạn nói đúng! Tôi sẽ thay đổi câu trả lời từ 16 bit thành 1 hoặc 2 byte –

9

Trong bài viết này http://fernandoipar.com/2009/03/09/using-the-enum-data-type-to-increase-performance/ Fernando nhìn vào biểu diễn của loại Enum cho các truy vấn. Kết quả là trong khi sử dụng ENUM có vẻ hơi kém thanh lịch từ một quan điểm thiết kế (nếu giá trị ENUM của bạn thay đổi đôi khi), hiệu suất đạt được là hiển nhiên đối với các tập dữ liệu lớn. Xem bài viết của anh ấy để biết chi tiết. Bạn có đồng ý không?