2017-10-12 10 views
1

私は以下のSQLクエリを持っており、クエリを最適化する方法があるかどうかを知りたいと思っています。MySQLでのSQLクエリの最適化

SELECT * FROM LogEntry WHERE UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(updateTime) > 10; 

はupdateTimeにインデックスを追加する予定の他の何かのパフォーマンスを向上させ、パフォーマンスを向上させるために行うことができます

+0

質問のバグ?これは過去10秒間の行だけを除外します。それはほとんどすべてのテーブルではありませんか? –

答えて

5

はい]を選択します。列の関数を削除する方法について考える必要があります。だから私は、ロジック権利がある場合:これは、その後LogEntry(updateTime)にインデックスを利用することができます

SELECT le.* 
FROM LogEntry le 
WHERE le.updateTime < NOW() - interval 10 second; 

を。

返される列を明示的に一覧表示する理由があります。これは、行のサイズが非常に大きい場合を除き、パフォーマンスにはほとんど影響しません。

+0

"関数(' UNIX_TIMESTAMP'と '-')内のインデックス付きカラム(' updateTime')を隠さないでください。重要なルールは最適化です。 –

0

私はどうしたらまず最初に*あなたの選択を削除して、特定の列

+0

これはしばしば有用ですが、Gordonの最適化ほどパフォーマンスにとって重要ではありません。 –

0

リクエストの最適化に加えて、テーブルの分割について考えることができます。 たとえば、logEntryテーブルをupdateTimeで1日ごとにパーティション化できます。テーブルに大量のデータがある場合は、リクエストを大幅に高速化できます。

注:updateTimeでテーブルをパーティション化するには、updateTimeをプライマリキーの一部にする必要があります。

+0

パーティション分割は役に立ちません。オプティマイザはその式の中で 'unixTime'を見ることができません。だから、剪定をすることはできません。 –

+0

私の提案は、Gordonの最適化に加えてテーブルを分割することでした –

+0

この場合、パーティショニングはパフォーマンスには役立ちません。 (さらに、10秒しか除外されているかもしれません(おそらくバグです)、テーブル全体がスキャンされます)。 –