2011-10-25 7 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データベースはブール値フィールドにインデックスを作成しません。
このフィールドのカーディナリティは低すぎます。カーディナリティの低いフィールドでインデックスを使用すると、スピードを上げるのではなく、物事が遅くなります。

を参照してください:あなたは、カラムのみ、あなたは@Johanに従うべきである他のテーブルを検索することからSQLを防ぐためにを「休止状態」を使用したい場合はMySQL: low cardinality/selectivity columns = how to index?

+0

cats miauw?私はいつも彼らが卑怯だと思った...心は==吹いた –

+0

@nathangonzalez多分彼らは、誰が確かに知ることができますか? –

+0

+1私の母国語ではない擬人動物の音については! –

0

は、そうでなければ、インデックスの上作成することができます列が "休止状態"になると、実行時間が改善されます。 しかし、@ヨハンがあなたに伝えようとしていることに留意してください。