2012-01-25 32 views
11

Tôi có một cột là ngày giờ, converted_at."không phải là null" so với boolean MySQL - Hiệu suất

Tôi định thực hiện cuộc gọi kiểm tra WHERE converted_at is not null rất thường xuyên. Như vậy, tôi đang xem xét có một trường boolean converted. Sự khác biệt về hiệu suất đáng kể của họ có phải là giữa một trường là not null và nếu nó là false?

Cảm ơn.

+1

Tôi không nghĩ rằng có một sự khác biệt hiệu suất đáng kể, nhưng nếu có, thì nó có thể có lợi cho 'không phải là null', vì khi thử nghiệm boolean nó vẫn sẽ muốn tìm hiểu xem nó không phải là null. –

+0

@ MichaelKrelin-hacker: Tôi đoán rằng trường boolean sẽ được định nghĩa là 'NOT NULL'. –

+0

@ypercube, tôi không nghĩ rằng nó sẽ được sử dụng như bất cứ điều gì nhưng hạn chế toàn vẹn. –

Trả lời

5

Nếu mọi thứ có thể trả lời trong một trường đơn lẻ, bạn có thể chia nhỏ điều tương tự thành hai trường. Điều này tạo ra cơ sở hạ tầng hơn, trong trường hợp của bạn là tránh được.

Đối với câu hỏi của tôi, tôi tin rằng hầu hết việc triển khai cơ sở dữ liệu, bao gồm MySQL, sẽ có một cờ nội bộ là boolean anyways đại diện cho NULLability của một trường.

Bạn nên tin tưởng rằng điều này được thực hiện một cách chính xác. Đối với hiệu suất, câu hỏi lớn hơn nên được trình bày về các truy vấn điển hình mà bạn chạy trên cơ sở dữ liệu và nơi bạn tạo chỉ mục thích hợp và phân tích bảng để cải thiện kế hoạch thực hiện và chỉ mục nào được sử dụng trong truy vấn. Câu hỏi này sẽ có tác động lớn hơn nhiều đến hiệu suất.

2

Sử dụng WHERE converted_at is not null hoặc WHERE converted = FALSE có thể sẽ giống nhau về các vấn đề về hiệu suất truy vấn.

Nhưng nếu bạn có trường bit bổ sung này, được sử dụng để lưu trữ xem trường converted_at có là Null hay không, bạn sẽ phải duy trì tính toàn vẹn (thông qua trình kích hoạt?) Bất cứ khi nào một hàng mới được thêm vào và mỗi lần cột được cập nhật. Vì vậy, đây là một sự bình thường hóa. Và cũng có nghĩa là mã phức tạp hơn. Hơn nữa, bạn sẽ có ít nhất một chỉ mục trên bảng (có nghĩa là một hoạt động Chèn/Cập nhật/Xóa chậm hơn một chút).

Vì vậy, tôi không nghĩ rằng việc thêm trường bit này là tốt.

Nếu bạn có thể thay đổi cột được đề cập từ NULL thành NOT NULL (có thể bằng cách bình thường hóa bảng), bạn có thể nhận được một số lợi ích hiệu suất (với chi phí/tăng thêm bảng).

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