3

次のMysqlクエリがあります

explain SELECT count(*) as assetCount 
          FROM MdhRawAsset m 
         where sysCreationDate > date_add(now(), INTERVAL -1 DAY) 
           AND sysCreationDate <= now() 
           AND itemType = 'TS';

結果 :

| id | select_type | table | type |possible_keys                                                    
|  1 | SIMPLE      | m     | range | MdhRawAsset_on_sysCreationDate, MdhRawAsset_itemType            
---------------------------------------------------------------------
|Key                          |Key_len  | ref  | rows  | Extra       |  
MdhRawAsset_on_sysCreationDate| 8       | NULL | 53269 | Using where |

質問:

  1. このクエリの実行時間を知るにはどうすればよいですか?
  2. テーブルMdhRawAssetには 3750 万のデータが含まれています。このクエリを記述するより良い方法はありますか?
4

5 に答える 5

1
  1. アランが言ったように

  2. 代わりにcount(id)を試してください。これはデータベースエンジンに依存しますが、私の経験では、*を使用しない方が常に高速です。

于 2010-11-09T04:43:40.020 に答える
1
  1. クエリの実行時間は、所要時間を判断するにはあまりにも多くの問題に依存します。サーバーの負荷、行数など。最善の方法は、通常の負荷で実行して、所要時間を確認することです。

  2. 正しいインデックスが設定されているように見えるので、最適化するためのより良い方法はわかりませんが、他の誰かが私よりもよく知っているかもしれません.

于 2010-11-08T23:17:06.307 に答える
1

まず、実行時間は、テーブル、サーバー、負荷、およびさまざまなレベルのどのキャッシュがウォームアップされるかによって異なります。

その特定のクエリのパフォーマンスを向上させるために、複合インデックス

... KEY itemType_sysCreationDate (itemType, sysCreationDate) ...

テーブルで、インデックスのみを使用してそのクエリを実行できるようにします。それよりずっと良くなることはできません。順序が重要であることに注意してください。

また、「now()」をアプリケーション層で生成された明示的な日付文字列に置き換えると、以前にクエリが表示され、かつテーブルが最後の実行以降に更新されておらず、かつクエリがまだキャッシュにあります。MySQL のクエリ キャッシュを推奨しているわけではありません。;)

于 2010-11-09T23:02:47.227 に答える
0

MS-SQLサーバーからのクエリプランについて考えている必要があります。これは、メモリが機能する場合、時間について何かを言及します。事実は、とにかくそれはクラップスです。クエリが合理的に可能な限り高速に実行されるかどうかを判断するには、との組み合わせが必要show index from <table>ですexplain ...

とのインデックスを使用すると、クエリが最速にitemTypeなりsysCreationDateます。これにより、一連のインデックスエントリを連続してカウントできます。

于 2010-12-22T04:29:37.560 に答える
0

現在、このクエリを実行するのにどれくらいの時間がかかっていますか? あなたはたくさんのデータを持っています。

クエリを実際に改善できない場合は、少し異なるソリューションが必要になる可能性があります-

  1. 問題にハードウェアを投入します - ボトルネックがどこにあるかを確認し、ハードウェアのその部分をアップグレードしてみてください

  2. サマリー テーブルを使用する - これが頻繁に作成されるレポートである場合は、データ ウェアハウス技術を使用してサマリー テーブルを維持すると役立つ場合があります。サマリー テーブルは、その場で (トランザクションが進行中の場合) または定期的に (最新の情報が必要ない場合) 更新できます。

データを集計テーブルに入れるときは、常に完全なカウントを行う必要はないことに注意してください。トランザクション テーブルに新しいレコードを追加するたびに、existing_summary_count = existing_summary_count + 1 を実行するだけで、コストのかかるクエリを実際に実行することなく、集計の増分値を取得できます。

于 2010-12-22T04:17:36.093 に答える