MySQLデータベースに2つのテーブルがあります。一つのテーブルには、データロギングのためのものであり、次の列があります。クエリのパフォーマンスをさらに向上させることができます(MySQL)
(これは、データロガーテーブルと呼ばれてみましょう)
ID - プライマリキー
サイトID、機器ID、機器番号、機器パラメータ、値を、ログされた日付
この表のレコードを選択するには、サイトのid、装置ID、装置番号、装置パラメータがwhere句で使用され、日付範囲(ログされた日付)が指定されます。
他のテーブルには、(これはloggerparameterdetailsテーブルと呼ばれるとする)次の列があります
機器ID 機器パラメータ - これら2複合主キー
パラメータの説明とパラメータユニットは、他されていますこの表の列
データロガー表には多数のレコードがあります(年間レコード数は約100万レコードになります)。アプリケーションのレポート目的では、パラメータ名のloggerparameterdetailsテーブルを使用してデータロガーテーブルを結合し、where句にサイトID、機器番号、パラメータ名、日付の記録範囲を指定します。
だから私は2つのテーブルに対して次のインデックス作成:サイトID、機器ID、機器番号、パラメータの名前と日付ログイン含む
複合インデックス - (これらの列がWHERE句がそう作成した場所に来るデータロガーテーブルをこれらのインデックス)
パラメータ名 - loggerparameterdetailsテーブル(このカラムは今年の日付範囲について参加)
で使用されているので、私は、クエリをプロファイリングし、データ送信プロセスは約3.5〜4秒を示していることがわかり。
select logtbl.date_logged, logparam.cmd_desc, logtbl.value, logparam.cmd_unit
from datalogger logtbl join loggerparameterdetails logparam
on logtbl.cmd_name=logparam.cmd_name where logtbl.site_id=1
and logtbl.equipment_number=1 and logtbl.cmd_name='aaaabbab'
and logtbl.date_logged between '2016-02-02 00:00:00' and '2017-02-06 00:00:00'
この時期はさらに大幅に改善することができます:クエリは次のようになりますか?
更新:
クエリの実行計画は以下の通りである:
'ID'; 'SELECT_TYPE'; 'テーブル'; 'タイプ'; 'possible_keys'; 'キー'; 'key_lenに';'; ';'; ';' ''; ''; '' ''; '' ''; '' '' '' '' ''; '使用する場所'
'1'; '単純'; 'logtbl'; '範囲'; 'loggertbl_combined_idx'; 'loggertbl_combined_idx'; '69'; \ N; '528604';結合バッファを使用する '
また、あなたの質問を説明書とともに編集してください。 – Mihai
あなたのクエリの前に 'explain'を追加し、その結果を投稿に追加してください。 – Alexey
'SHOW CREATE TABLE'を提供すると、それほど混乱がなく正確です。 –