2016-03-31 19 views
0

私は、たくさんの行(数百万)を持つMySQL(InnoDB)テーブルを持っています。私のようなクエリをやってる:大テーブルのTIMESTAMPカラムの比較

SELECT SQL_CALC_FOUND_ROWS `a` 
FROM `logs` 
WHERE `connect_timestamp` > 10000 
ORDER BY `connect_timestamp` DESC 
LIMIT 1 

私は、通常のインデックスが列に追加した、しかし、このようなクエリは20秒までかかる、より良い方法はありますか? spencer7593とMartinからのコメントに基づいて

+0

「通常の」インデックスとは何ですか? – Martin

+0

あなたは 'connect_timestamp'カラムにインデックスを持ちたいと思っています。 – Martin

+0

そして 'EXPLAIN'を使ってSQLの説明を手伝ってください – Martin

答えて

1

編集:

簡単な数+選択クエリは、1 SQL_CALC_FOUND_ROWSよりもはるかに高速であるかもしれません。参照: Which is fastest? SELECT SQL_CALC_FOUND_ROWS FROM `table`, or SELECT COUNT(*)

私は両方のあなたの元のクエリを実行していると示唆:

SELECT count(*) 
FROM `logs` 
WHERE `connect_timestamp` > 10000 

プラス:

SELECT `a` 
FROM `logs` 
WHERE `connect_timestamp` > 10000 
ORDER BY `connect_timestamp` DESC 
LIMIT 1 

ベストでも測定(および追加)に追加EXPLAINですべてを実行するためのランタイムと違いを参照して、SQL_NO_CACHEを追加して最初の実行をシミュレートすることもできます。参照:https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

をそれは私が次のように見えることをお勧め全く解決しない場合:あなたが試すことができます

もの:検索に使用されるカラムは(あなたに思える

  • インデックス既に完了しています)
  • 頻繁に実行される特定のクエリのビューを作成します。
  • サーバーにメモリがある場合は、特定のテーブルをキャッシュするようにしてください。
  • マーティンのコメントのように、クエリーのどの部分が常に時間を費やしているかを見るために、クエリーの前にEXPLAINを入れてください。たぶんあなたがそれについて変えることができるものがあります。

これは私が思いつくことができるものです。

+1

は 'select'によって呼び出された' a'列ではありませんか? – Martin

+0

もしそうでなければ、確実に 'COUNT' SQLはOPの現在のSQLより優れていますか? – Martin

+0

ああ、私の悪い:この場合は、選択した変数の名前を変更しますが、結果の名前を変更すると、質問が遅くなることはありません。私はそれを削除します、ありがとう! – Jester

0
INDEX(connect_timestamp, a) 

これによりSQL_CALC_FOUND_ROWSだけでなく、SELECT ... LIMIT 1をスピードアップ、「覆い」のインデックスになります。

インデックスの最後から10000までスキャンする必要があります。それは何行ですか?

connect_timestampではなくINTのいくつかのタイプのCHARのいくつかのタイプである場合は、問題を抱えています。 SHOW CREATE TABLEを提供してください。

関連する問題