20

textから列の内容を選択したいentrytable

EXPLAIN SELECT text
FROM entrytable
WHERE user = 'username' &&
`status` = '1' && (
    `status_spam_user` = 'no_spam'
    || (
        `status_spam_user` = 'neutral' &&
        `status_spam_system` = 'neutral'
    )
)
ORDER BY datum DESC
LIMIT 6430 , 10

テーブルには3つのインデックスがあります。

  • index_user(ユーザー)
  • index_datum(データム)
  • index_status_mit_spam(status、status_spam_user、status_spam_system)

EXPLAINの結果は次のとおりです。

id  select_type     table       type    possible_keys                       key         key_len     ref     rows    Extra
1   SIMPLE          entrytable  ref     index_user,index_status_mit_spam    index_user  32          const   7800    Using where; Using filesort
  • possible_keysMySQLが使用する可能性のあるインデックスとkeys、MySQLが実際に使用するインデックスはありますか?
  • インデックスindex_status_mit_spamが使用されないのはなぜですか?クエリでは、列の順序はインデックスと同じです...
  • インデックスindex_datumが使用されないのはなぜORDER BYですか?
  • テーブルインデックスまたはクエリを最適化するにはどうすればよいですか?(上記のクエリには、テーブルに約100万のエントリがある場合、最大3秒かかります)
4

2 に答える 2

12

あなたの質問に答える:

  • possible_keysMySQLが使用する可能性のあるインデックスとkeys、MySQLが実際に使用するインデックスはありますか?はい、これは正しいです。

  • インデックスindex_status_mit_spamが使用されないのはなぜですか?クエリでは、列の順序はインデックスと同じです。SQLは、テーブルのインデックスの統計を使用して、使用するインデックスを決定します。selectステートメントのフィールドの順序は、使用するインデックスに影響を与えません。インデックスに関する統計には、インデックスの一意性などの情報が含まれます。より一意のインデックスが使用される可能性があります。これについて詳しくは、 http: //dev.mysql.com/doc/innodb/1.1/en/innodb-other-changes-statistics-estimation.htmlまたはここ:http ://dev.mysql.com/doc/をご覧ください。 refman / 5.0 / en//myisam-index-statistics.html。これらの要因により、MySQLが使用する1つのインデックスを選択する方法が決まります。1つのインデックスのみを使用します。

  • インデックスindex_datumが使用されないのはなぜORDER BYですか?2番目のインデックスを使用するとクエリがさらに遅くなるため、MySQLはクエリ中に2つではなく1つのインデックスのみを使用します。インデックスの読み取りは、テーブルの読み取りではありません。これは、クエリの運用効率に関連しています。いくつかの概念を説明できる回答は次のとおりです。https ://dba.stackexchange.com/questions/18528/performance-difference-between-clustered-and-non-clustered-index/18531#18531または MySQLクエリにlimit句を追加すると遅くなりますそれは劇的にダウンします または MySQLインデックスとそれらをいつグループ化するか。これらの回答には、MySQLインデックスを理解するのに役立つ詳細がたくさんあります。

  • テーブルインデックスまたはクエリを最適化するにはどうすればよいですか?(上記のクエリには、テーブルに約100万のエントリがある場合、最大3秒かかります)。さて、おそらくあなたを遅くしているファイルソートがここにあります。テーブルのインデックスが多すぎて、MySQLが間違ったインデックスを選択している可能性があります。

インデックスはテーブルへの読み取りを高速化し、書き込みを遅くすることを理解する必要があります。したがって、インデックスを追加するだけでは必ずしも良い考えではありません。上記の回答と指針は、しっかりとした理解を得るのに役立つはずです。

于 2013-01-03T11:22:34.933 に答える
3
  • possible_keysテーブルのすべてのインデックス(キーまたはインデックス列)を示します
  • MySQLオプティマイザは、クエリを実行するための最良の方法を決定します。任意のインデックス(主キーは不要)を使用するか、何も使用しません。
  • MySQLにpossible_keys列にリストされているインデックスを使用または無視させるには、、、FORCE INDEXまたはUSE INDEXクエリIGNORE INDEXでを使用します
  • このリンクを確認してください-http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

    ヒントにFOR句を追加することにより、インデックスヒントのスコープを指定できます。これにより、クエリ処理のさまざまなフェーズでオプティマイザが実行プランを選択する際のよりきめ細かい制御が可能になります。MySQLがテーブル内の行を検索する方法と結合を処理する方法を決定するときに使用されるインデックスのみに影響を与えるには、FORJOINを使用します。行の並べ替えまたはグループ化のインデックスの使用に影響を与えるには、FORORDERBYまたはFORGROUPBYを使用します。(ただし、テーブルにカバーインデックスがあり、それを使用してテーブルにアクセスする場合、オプティマイザは、そのインデックスを無効にするIGNORE INDEX FOR {ORDER BY | GROUP BY}ヒントを無視します。)

  • 別のインデックスを強制してみてください-このリンクを確認してください-MySQL`FORCEINDEX`のユースケース?

  • EXPLAIN出力形式を理解する-http ://dev.mysql.com/doc/refman/5.1/en/explain-output.html

于 2013-01-03T11:25:46.310 に答える