1

このクエリには 1 時間かかります

select *,
      unix_timestamp(finishtime)-unix_timestamp(submittime) timetaken 
from joblog 
where jobname like '%cas%' 
and submittime>='2013-01-01 00:00:00' 
and submittime<='2013-01-10 00:00:00'
order by id desc limit 300;

しかし、1 つの同じクエリはsubmittime0.03 秒程度で終了します

テーブルには 210 万行あります

問題の原因やデバッグ方法についてのアイデア

4

3 に答える 3

0
select *,unix_timestamp(finishtime)-unix_timestamp(submittime) timetaken  
from joblog  
where   (submittime between '2013-01-10 00:00:00'  and  '2013-01-19 00:00:00')   
and jobname is not null 
and jobname like '%cas%';

これは役に立ちました

(0.93秒)

于 2013-01-18T07:04:08.777 に答える
0

最初のステップは、MySQL EXPLAINを使用して、クエリが何を行っているかを確認することです。おそらく、問題を解決する方法についての洞察が得られるでしょう。

私の推測ではjobname LIKE '%cas%'、ワイルドカード テキスト検索を行っているため、これが最も遅い部分です。先頭にワイルドカードがあるため、ここにインデックスを追加しても役に立ちません。そのような先頭のワイルドカードなしでこのクエリを実行する方法はありますか? また、インデックスを追加するsubmittimeと、このクエリの速度が向上する場合があります。

于 2013-01-17T17:15:02.053 に答える
0

クエリに LIMIT を追加して、返される速度が向上するかどうかを確認してみてください...

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.htmlからの抜粋

「MySQL は、使用可能な場合でも、インデックスを使用しないことがあります。これが発生する状況の 1 つは、オプティマイザーが、インデックスを使用するために MySQL がテーブル内の行の大部分にアクセスする必要があると見積もった場合です。(この場合、ただし、そのようなクエリが LIMIT を使用して一部の行のみを取得する場合、MySQL はとにかくインデックスを使用します。結果を返します。」

于 2013-01-17T17:20:39.057 に答える