2012-01-25 34 views
11

我有一個日期時間列,converted_at「is not null」vs boolean MySQL - 性能

我打算做的是檢查WHERE converted_at is not null經常通話。因此,我正在考慮有一個布爾字段converted。檢查一個字段是not null還是false?它們在性能上有顯着區別嗎?

謝謝。

+1

我不認爲有顯著的性能差異,但如果有,那麼它可能有利於'不null',測試布爾還是會想找出它是否不爲空時,因爲。 –

+0

@ MichaelKrelin-hacker:我猜布爾值字段會被定義爲「NOT NULL」。 –

+0

@ypercube,我不認爲它會用作任何東西,但完整性約束。 –

回答

5

如果事情是你是否贊成,超過劈裂同樣的事情分成兩場單場交代。這創造了更多的基礎設施,在你的情況下是可以避免的。

至於問題的要點,我相信大多數數據庫實現,MySQL的在內,將有一個內部標誌是布爾反正用於表示一個字段爲空性。

你應該相信這是爲你正確完成的。

至於性能,更大的問題應該在剖析您在數據庫上運行典型的查詢,並在其中創建合適的索引和分析表上,以提高執行計劃和索引的查詢過程中使用。這個問題會對性能產生更大的影響。

2

使用WHERE converted_at is not nullWHERE converted = FALSE可能會在查詢性能的問題是相同的。

但是,如果你有這個額外的位字段,用於存儲converted_at字段是否爲空,那麼無論何時添加新行,每次添加新行時都必須保持完整性(通過觸發器?)列被更新。所以,這是一個非正常化。也意味着更復雜的代碼。此外,表中至少還有一個索引(這意味着插入/更新/刪除操作稍慢)。

因此,我認爲不需要添加這個位域。

如果您可以將有問題的列從NULL更改爲NOT NULL(可能通過對錶格進行規範化),您可能會獲得一些性能提升(以獲得更多表的成本/收益)。