2011-10-25 59 views
4

我正在開展一項頗有創意的副項目;我的問題是關於使用BOOLEAN值來確定是否需要進一步的數據處理時所獲得的效率。通過BOOLEAN值優化SQL(mySQL)

例如:如果我有一個列出所有生物的表格。在另一個關係性的表中列出了它們的冬眠期,以及冬眠期間每天消耗的卡路里。

在(Creatures)表格中爲「休眠」BOOLEAN值是否有效?

如果爲true,則轉到「hibernation_creature_info_relations」表並找到具有該ID的生物並返回該信息。

這意味着對於「hibernates」= false值的所有生物而言,SQL將無法搜索「hibernation_creature_info_relations」大表。

或者當使用ID時,如此快速地檢查「hibernation_creature_info_relations」表的速度非常快,以至於如果設置了休眠的值,則必須處理基於做什麼的參數,從而實際上會對性能產生更大的影響爲真或假?

我希望這是足夠的信息來幫助您瞭解我所問的問題,如果不是,請讓我知道,以便我可以更改或包含更多詳細信息。

+0

通過在其他表中複製休眠字段,您不會獲得太多收益。減少數據集大小所帶來的任何速度收益都將通過不得不重新加入原始表格來抵消。 –

+0

另外,請記住,與命令式語言不同,您(通常)幾乎不能控制SQL中的執行排序/優化。這是優化器的工作,它可以執行各種各樣的事情來「加速」查詢 - 包括重新排序連接,使用表掃描,切換索引,選擇不同的順序以及創建臨時表。實際上,短路邏輯並沒有什麼特別的地方,特別是在連接的情況下(優化器可以隨意混淆它們)。 –

回答

5

不,這不是一個很好的辦法。

使用一個普通的字段,而不是null

table creatures 
--------------- 
id  name  info_id 

1  dino  null 
2  dog  1 
3  cat  2 

table info 
-------------- 
id  info_text 

1  dogs bark 
2  cats miauw 

現在你可以做一個連接:

SELECT c.name, i.info_text 
FROM creature c 
LEFT JOIN info i ON (c.info_id = i.id) 

如果你不喜歡這樣,SQL可以使用索引。
沒有SQL數據庫將在布爾字段上創建索引。
該字段的基數太低,在低基數字段上使用索引會減慢速度,而不是加快速度。

參見:MySQL: low cardinality/selectivity columns = how to index?

+0

貓miauw?我一直以爲他們喵...心靈==吹 –

+0

@nathangonzalez也許他們這樣做,誰可以肯定知道? –

+0

+1對於非本族語言的動物聲音! –

0

如果你想使用的列「休眠」 阻止SQL不必通過其他表來進行搜索,那麼你應該遵循@Johan否則,你可以上創建索引該列「休眠」它會提高執行時間。 但請記住@Johan試圖告訴你什麼。