我有一個日期時間列,converted_at
。「is not null」vs boolean MySQL - 性能
我打算做的是檢查WHERE converted_at is not null
經常通話。因此,我正在考慮有一個布爾字段converted
。檢查一個字段是not null
還是false
?它們在性能上有顯着區別嗎?
謝謝。
我有一個日期時間列,converted_at
。「is not null」vs boolean MySQL - 性能
我打算做的是檢查WHERE converted_at is not null
經常通話。因此,我正在考慮有一個布爾字段converted
。檢查一個字段是not null
還是false
?它們在性能上有顯着區別嗎?
謝謝。
如果事情是你是否贊成,超過劈裂同樣的事情分成兩場單場交代。這創造了更多的基礎設施,在你的情況下是可以避免的。
至於問題的要點,我相信大多數數據庫實現,MySQL的在內,將有一個內部標誌是布爾反正用於表示一個字段爲空性。
你應該相信這是爲你正確完成的。
至於性能,更大的問題應該在剖析您在數據庫上運行典型的查詢,並在其中創建合適的索引和分析表上,以提高執行計劃和索引的查詢過程中使用。這個問題會對性能產生更大的影響。
使用WHERE converted_at is not null
或WHERE converted = FALSE
可能會在查詢性能的問題是相同的。
但是,如果你有這個額外的位字段,用於存儲converted_at
字段是否爲空,那麼無論何時添加新行,每次添加新行時都必須保持完整性(通過觸發器?)列被更新。所以,這是一個非正常化。也意味着更復雜的代碼。此外,表中至少還有一個索引(這意味着插入/更新/刪除操作稍慢)。
因此,我認爲不需要添加這個位域。
如果您可以將有問題的列從NULL
更改爲NOT NULL
(可能通過對錶格進行規範化),您可能會獲得一些性能提升(以獲得更多表的成本/收益)。
我不認爲有顯著的性能差異,但如果有,那麼它可能有利於'不null',測試布爾還是會想找出它是否不爲空時,因爲。 –
@ MichaelKrelin-hacker:我猜布爾值字段會被定義爲「NOT NULL」。 –
@ypercube,我不認爲它會用作任何東西,但完整性約束。 –