2012-04-17 14 views
-2

私は510,085行のテーブルを持っています。これは現在、より高いパフォーマンスを求めています。この表のフィールドの1つは「photoStatus」と呼ばれます。1つの列のSQLパフォーマンス

'photoStatus'では、510,045行に「アクティブ」という単語が含まれ、残りの40に「Suspended」という単語が含まれています。

「アクティブな」写真を検索するのが速いのはどちらですか?それとも重要ではありませんか?

WHERE photoStatus = 'Active' 

Or 

WHERE photoStatus <> 'Suspended' 

明らかに、これは膨大なクエリの一部ですが、これは単なるWHERE条件ではありません。あなたはその列WHERE photoStatus = 'Active'にインデックスを持っている場合は、サーバーだけでActiveに一致するインデックス内の範囲をスキャンすることができますので、

データベースは、MySQL(MyISAMテーブル)

+2

どのデータベースを使用していますか? –

+0

使用しているデータベースシステムが不明ですが、SQL Serverでは、SQL Serverがこれを判別できる唯一の方法は、「アクティブ」ステータスエントリが存在するためにテーブル(またはそのクラスタ化インデックス)データの大部分を占めています。インデックスは実際にはあまり役に立ちません....また、すべてを選択しているか(SELECT *)、またはカバリングインデックスで処理できるクエリがあるかどうか、つまりあなたが必要とする値があれば、おそらくSQL Serverは小さなインデックスでインデックススキャンを実行できます。 –

+0

私はMyISAM – TheCarver

答えて

2

アルゴデータベース比較に応じて結果を含むのに十分です文字列比較よりもはるかに速い数値を入力すると、次のようになります。

.... 
    WHERE isActive; 
+0

はい、私はこれがあなたの質問のより多くのスピードを得るために最高であると思います。これを試すことができますか? – Tobi

+0

これは、より速いsmidgenでした。私はブール型の代わりにINT(1)を使用し、 "WHERE photoStatus;"を実行したので、MySQLを使用しています。多くはありませんが、特にクエリには2つのWHERE条件があります。このシナリオでは – TheCarver

0

で速くなります。ブール値の列、またはAを変換しないのはなぜ

+2

でMySQLを使用しているかもしれませんが、データが非常に歪んでいる(99%より大きい "アクティブ"とわずかな "中断")ので、SQL Serverのクエリオプティマイザはスキャンを行います持っています... –

0

それだけで最初の文字の比較文字列全体を比較する必要がないので、第二には、「小さな」速くなりますが

0

このフィールドには必ずインデックスを使用してください。クエリをEXPLAINして、クエリの効率を確認します。

それ以外のクエリではフィルタが40個だけ除外されるため、残りのクエリは効率的でなければなりません。

+2

はインデックスが役に立たない –

0

テーブルと行をどちらかの方法でインデックスする必要があります。

個人的に私は常に一致します。 equalsを使用します。私は常に文字列にマッチするよりも良いintやboolean型を、使用し

WHERE photoStatus = 'Active' 

..

0

実際に返される行の割合が大きいことであるため、通常のインデックスは、このシナリオに役立つことはありません。

したがって、データベースは各行を参照する必要があります。同じ対比較がどれほど速いかによっていくつかの違いがあるかもしれませんが、それは無視できるはずです。

私は結果がかなり同じスピードであることを期待しています。

0

クエリのショートカットを見つけるための詳細はほとんど表示されていません。

完全にスキャンする必要があります。この場合、テーブルを並行して読み込めます。 使用しているDBMSがわからないが、オラクルではヒントを使用することができますselect /*+parallel(yourtable 8)*/ from yourtable

このデータを使って何をしようとしていますか?どんなタイプの質問が遅いのですか?例を挙げることはできますか?多くのトリックがあり、多くの間違いをすることができます。すべてのクエリが高速に動作するわけではありません。 UI用の場合は、< 1秒で応答する必要があります。しかし、それが管理タスクの場合は、1分かかる場合があります:)

0

あなたの例に似た小さなテストに基づいてその列にインデックスを持っている場合、photoStatus = 'Active'が良いです。

SQL Serverでクエリの実行を追加しました。短いものは等しい比較に属します。より良いパフォーマンスを報告しています。あなたがインデックスを持っていないなら、クエリコストは似ています。

where statusname = 'Active'

where statusname <> 'Suspend'

0

まず、.5M行は大きなテーブルではない - 任意の手段によって。

"Active"/"Inactive"のような列は、索引スキャンを有効にするのに十分な選択性がないため、それ自体では索引としては役に立たない可能性があります(実際には50%テーブルの行のうち、テーブルスキャンがおそらくより良いでしょう)。

私は実際には、 "アクティブ"はあなたの問題とは関係ないと思っています。結局のところ、クライアントに.5M行を返そうとしていないのですか?

行を返すだけで(比較的)長い時間がかかるため、.5M行を返すクエリは高速になりません。

とにかく私の答え:それは違いはありません、クエリの他の部分を確認する必要があります。フル・クエリー、表構造、および出力の説明付きで質問を投稿してください。

関連する問題