2017-06-23 19 views
0

私のMySQLデータベースは、以下の構造を有する:私はそれに対して、単純なクエリを実行するとPHP MYSQL-インデックス作成を利用しますか?この場合も可能ですか?

enter image description here

、それが実行に30秒を要します。 クエリがある - 私はこれに対してEXPLAIN実行すると

SELECT signinid,photo,first_name,last_name,persontosee,signindate,signintime,isstaff,signouttime,signoutdate,issignedin,companyname,veh_reg 
FROM signin_entries 
WHERE issignedin ='YES' 
AND isstaff='YES' 

は、私はそれがすべての1180行を処理している見ることができ、トラブルはすべてがBase64でエンコードされた文字列を含む列、写真、署名やQRコードです。 (私の選択した声明では、私は「写真」のみを照会しています)

このための索引はどのように作成できますか?インデックスは正しい方法ですか?なぜ単純なクエリを実行するのに30秒かかるのですか?

ありがとうお時間を

Explain statement

+0

あなたはEXPLAIN出力を追加することはできますか? – Neodan

+0

id select_typeテーブルタイプpossible_keysキーkey_len参照行追加 1 SIMPLE signin_entries ALL staffsigned in NULL NULL NULL 1218ここで、 – Retroisbest

答えて

0

issignedinは、テキスト列です。テキスト列を索引付けすることはできません。それをvarcharに変更し、インデックスを追加します。

+0

ステータスカラムにVarcharを使用していますか? – GhostGambler

+0

著者が値を「はい」または「いいえ」に制限しているとは限りません。もしそれが当てはまる場合は、代わりにsmallintまたはenum –

+0

をお勧めしたいと思います。次に、issignedinとisstaffの両方をsmallintsに変更し、両方をカバーするキーを追加することをお勧めします( "alter table signin_entries add key signedin_staff (issignedin、isstaff); ") –

4

あなたの現在の構造を持つ複数の問題があります。

  • は、例えば、あなたが列のための可能な最小のタイプを使用する必要がありますいくつかの固定値( "yes"、 "no"、 "maybe")または "yes"/"no"列のさらに単純なbooleanのカラムの場合はenumです。
  • varchar列に時間を格納するのではなく、timeまたはtimestampの列を使用します。
  • 既存のdate列をdatetimeに変換してください。時間を保存することもできます。
  • 理由がない限り、バイナリデータをデータベースに格納しないでください。あなたはすべての問題を修正した後

あなたは、さらに実行時間を改善するために、2つの列の上に組み合わせたインデックスを追加することができます

CREATE INDEX issignedinandstaff ON signin_entries (issignedin, isstaff) 
+0

私にとっては速すぎる! enumは避けるべきですが、非常に非効率的で、非常に大きなデータセットのディスク上のスペースを除いて、varchar/boolean/intと比較して実際の値を保持しません。 OPが時間を必要としない場合は、おそらく 'DATE'データ型の使用を提案してください。+1どちらかの方法 – FMashiro

+0

@FMashiroなぜ 'enum'は非効率的だと思いますか?基本的には「smallint」です。数値を使用することもできます。 'Varchar'は実際には文字列であり、固定値の範囲に使うべきではないので、非効率的です。 – GhostGambler

+0

ありがとうございましたGhostGambler、 バックアップとファイルの保存場所を維持するためにバイナリデータ(base64)を使用していましたが、「写真」列をクエリから取り除くと、そのクエリの実行は高速になります。私のクエリはまだ長い時間がかかるインデックスを使用しています。 – Retroisbest

関連する問題