0

私は初めてインデックスを詳細に調べ始め、初めてユーザーテーブルから始めてデータベースの分析を開始しました。私はSOを検索して同様の質問を見つけましたが、検索をうまく組み立てることができなかったと思います。

私は特定の概念を経験していましたが、この最初の観察で疑問に思いました-これらの説明の違い[違い:最初のクエリは使用'a%'していますが、2番目のクエリは使用しています'ab%']

[テーブルの行の総数users= 9193 ]:

1) explain select * from users where email_address like 'a%';

ここに画像の説明を入力してください

(実際に一致する列= 1240

2) explain select * from users where email_address like 'ab%';

ここに画像の説明を入力してください

(実際に一致する列= 109

インデックスは次のようになります。 ここに画像の説明を入力してください

私の質問: 最初のクエリでインデックスが完全に無視されるのはなぜですか?mySqlは、インデックスを使用しない方がよいと考えていcase 1ますか?はいの場合、なぜですか?

4

2 に答える 2

0

これはあなたの質問に対する直接の答えではありませんが、それでも指摘したいと思います(あなたがすでに知らない場合に備えて):

試す:

explain select email_address from users where email_address like 'a%';
explain select email_address from users where email_address like 'ab%';

対象の列はインデックスから直接利用できるため、MySQLは上記の両方のクエリでインデックスを使用するようになりました。

おそらく「select*」を実行する場合、オプトマイザーはインデックスレコードを調べ、行IDを見つけてからテーブルに戻って他の列の値を取得する必要があるため、インデックスへのアクセスにはコストがかかります。

ただし、「select email_address」のみを実行する上記のクエリでは、オプトマイザーは必要なすべての情報がインデックスから直接利用できることを認識しているため、30%のルールに関係なくインデックスを使用します。

専門家、私が間違っている場合は私を訂正してください。

于 2012-12-25T20:39:19.917 に答える
0

mysqlが値の分布に基づいて収集する確率に基づいて、合計行の特定の比率(通常は合計の1/11)を超える場合、mysqlは、ディスクページを順番に読み取るテーブル全体をスキャンする方が効率的であると見なします。 、ランダムな順序でディスクページをジャンプするインデックスを使用するのではなく。

インデックスを使用する可能性のあるこのクエリで運試しをすることができます。

where email_address between 'a' and 'az'

フルスキャンを実行すると、実際には高速になる場合があります。

于 2012-12-26T01:21:19.223 に答える