Mysql
布爾列 true 和 false 與 true 和 null 哪個更好?
當我們需要在數據庫中儲存布爾欄位時,哪個更好?true 和 null 或 true 和 false 的組合。
我看過很多文章說要使用真假。一些報告說 true 和 null 組合提供了更好的性能。
我正在用 Ruby on Rails 和 mariadb 設計一個網站。我需要將布爾狀態欄位添加到具有 100 萬行的表中。
此狀態欄位的用途是過濾和報告。
在 MySQL / MariaDB / InnoDB 中,
NULL
索引就像它只是另一個可能的值一樣。有什麼關係…
- 用於
NULL
業務邏輯,而不是性能。例如:“尚未回答”、“拒絕說明”、“N/A”、“尚不清楚”(例如end_time
)、“不關心”。- 測試是否相等: (
x = 0
,x = false
,x IS NULL
,x = 1
,x = true
) 比測試不等式要好。(一些,不是全部,優化在相等性測試中效果更好。)INDEX
通常,永遠不會使用布爾量上的單列。例外情況是其中一個值很少出現並且您正在測試是否等於該值。- 另一方面,擁有一個
INDEX
包含布爾列的複合是非常好的。(同樣,您需要測試是否相等,而不是不平等。)- 即使你把布爾值放在首位並且它的選擇性很差,優化器也可能能夠很好地利用索引。在這個極端範例
INDEX(is_deleted, created_at)
中,無論表大小或選擇性如何,都只需要查看 1 行:WHERE is_deleted = false -- Similarly: deleted_date IS NULL ORDER BY created_at -- ASC or DESC LIMIT 1