2017-02-21 2 views
1

のためにソートされるように、DBは次のようになります。MySQLの行は、私はDB内のイベントを保つMySQLサーバを持っているパフォーマンス

ウェブUIで
id | epoch_time | type | event_text | .... 
---|------------|------|-------------|----- 
01 | 1487671205 | 0 | user-login | .... 
02 | 1487671284 | 0 | user-logout | .... 
03 | 1487671356 | 1 | sys_error | .... 
04 | 1487671379 | 0 | user-logout | .... 
05 | 1487671389 | 2 | user_error | .... 
06 | 1487671397 | 1 | sys_error | .... 

、過去24時間のイベントの夏によるありDBは1年前のデータログを保持しているため、現時点では1Mのレコードがあり、サイトのロードが非常に遅くなっています(明らかな理由から)。 SQLクエリは簡単です

SELECT COUNT(id) as total FROM `eventLog` WHERE `epoch_time` >= (UNIX_TIMESTAMP() - 86400) 

私の質問は - それは持っている生のヒット一度ようepoch_time列がソートされていることにMySQLを「伝える」ための方法があります:

は、
epoch_time < (UNIX_TIMESTAMP() - 86400) 

クエリは終了します。

- (ページをロードするために12秒」〜7)[UPDATE]

はあなたの助けありがとうございまし

おかげ

は、私は、インデックスを追加しようとしましたが、性能はまだ悪いです

統計情報だけを保存するのは理にかなっていますか?

+0

を代わりに数えIDの..あなたは$ Q-> NUM_ROWSを試すことができます()。 count(id)は別の関数を実行してクエリの負荷を増加させるためです。 – Vinay

+0

epoch_timeにインデックスを追加すると、役立つかもしれません。クエリをキャッシュすることもできます。私はあなたが1Mの結果をすべて最新のものに見せてくれるとは思わない?これはクエリキャッシュの優れた仕事です。 – mroman

答えて

1

あなたが使用してインデックスとしてepoch_time設定することができます:あなたのクエリを行います

ALTER TABLE `eventLog` ADD INDEX epoch_time (`epoch_time`) 

がはるかに高速に実行、

関連する問題