結果セットを5行に制限しているため、5行しかありません。クエリの最後の行を参照してください。それでも、MySQLはそれらの651223行を調べて、5行だけを表示する結果セットを見つける必要があります。sub
これは、LIKE句が。で始まるため、列でインデックスを使用できないため%
です。列にインデックスがある場合app
、いくつかの理由で使用されない場合があります。テーブルが保持している行数と比較して、明確な値が少なすぎる可能性があります。そのため、MySQLはソートに主キーインデックスを使用することを決定します(句による順序)。explain
コメントであなたの結果を実際に読むことができないので、少なくとも私はそう思います。次回は、そのような情報を質問に編集してください。
これSET timestamp=1361437845
は、クエリがunix_timestampとして実行された時刻です。
更新(さらに説明):
LIKE句はLIKE '%katrina%'
です。これは、「文字列のどこかにカトリーナがあり、その前後に文字がある可能性がある」という意味です。ここで、これらの基準に基づいて電話帳で誰かを調べたいと思ったと想像してみてください。電話帳がアルファベット順に並べられているという事実は、人の名前がAnkatrinaまたはZekatrinaである可能性があるため、役に立ちません。列のインデックスと同じsub
です。
300万行あり、100万行に列アプリの「pic」があり、100万行に「nic」があり、100万行に「asdf」があるとします。これは、インデックスを調べてから、テーブルで実際のレコードを調べるのは実際には余分な作業であることを意味します。そのため、テーブル全体をスキャンする方が安い場合があります。しかし、私が言ったように、それは単なる推測です。データベースに関する十分な情報がありません。
インデックスがあるからといって、そのインデックスが使用される保証はありません。
EXPLAIN
スロークエリログではなく5行と表示される理由は、EXPLAIN
実際には単なる推測であり、オプティマイザがクエリを処理する方法です。それが実際にどのように処理されるかを知りたい場合は、を使用してEXPLAIN EXTENDED
ください。ここで少し注意が必要なのは、クエリで行を調べなくても、それほど多くの行を調べる必要がないということORDER BY id DESC
です。次に、MySQLは実際には5行をスキャンして、結果を吐き出しますLIMIT 5
。順序付けのため、おそらく最初に一時テーブルを作成し、並べ替えて、そのテーブルから5行を吐き出す必要があります。これはでは考慮されていませんEXPLAIN
が、で考慮されている可能性がありslow-query-log
ます。