0

MySQL データベースにテーブルがあります。

  CodeNo Block
   a1     a
   a2     a
   b1     b
   b2     b
   c1     c
   c2     c 

次の 2 つの方法のいずれかを使用してクエリを実行できます。

select codeno from mytab where block='b' and codeno like 'b%'

代わりに

select codeno from mytab where codeno like 'b%'

mytab に何百万ものレコードがある場合、実際のシナリオでどちらが高速ですか? また、データベースに実際に保存されている方法を誰かが説明できますか?

4

5 に答える 5

0

両方の実行計画が同じなので、両方とも同じ時間がかかると思います

ここに画像の説明を入力

  1. データを選択

  2. テーブルスキャン 100%

実行計画の詳細も見てください

ここに画像の説明を入力

ここに画像の説明を入力

于 2013-10-01T11:38:11.740 に答える
0

実行計画を見なければ、最初のフィルターは2番目のフィルターが設定されているレコードの量を減らすだろうと推測します。数値またはバイナリ比較として。

これについて詳しく知るには、両方のステートメントの実行計画を生成し、実行時間を比較できます。ドキュメントをご覧ください。

于 2013-10-01T11:38:20.893 に答える
0

最初のクエリは高速である必要があり、ブロック フィルターを使用して結果を制限します。

私はこう言います: インデックスを適用しblockて速度を上げます。

ALTER TABLE mytab ADD INDEX blockindex(ブロック);

sqlfiddle を参照して、実行計画を比較してください: http://sqlfiddle.com/#!9/317d6/1

于 2013-10-01T11:40:39.717 に答える
0

テーブルにインデックスがない場合、メモリから何も取得できないため、最初のクエリに少し時間がかかりますが、1 つではなく 2 つのフィールドをチェックする必要があります。

しかし、この種の非正規化は、独自のインデックスを追加できる場合に非常に役立ちます。インデックスのみを追加(block)して、等値チェックがメモリ内で実行され、2 番目の条件のデータがディスクから取得されますが、最初の条件に一致した行のみが取得されます。これは、最初の条件に一致するほとんどの行が 2 番目の条件にも一致する場合に特に役立ちます。

(codeno(1))反対側からは、インデックスを追加できます。インデックスはプレフィックス チェックに使用されcodeno like 'b%'ます (インデックスには十分な長さのプレフィックスを指定してください)。これにはほぼ同じ時間がかかります。この場合、条件block='b'は必須ではなく、妨げになります。

于 2013-10-01T16:12:03.677 に答える
0

説明に関する@juergendのコメントを参照してください。問題は「場合による」です。どちらのフィールドにもインデックスがない場合、DB は完全なテーブル スキャンを実行するため、実質的な違いはありません。codeno にインデックスがあり、block にない場合、どちらの場合も codeno のインデックスを使用するため、2 つのステートメントはほぼ同等です。DBが最初のアクセスにブロックインデックスを使用する方が有益であると判断した場合、両方のフィールドにインデックスを付ける場合、2つの条件を持つフィールドの方が高速になる可能性があります。ただし、説明では、DB がアクセス プランに使用することを決定したものを表示する必要があります。

于 2013-10-01T11:43:48.570 に答える