2017-05-25 62 views
0

我在MySQL數據庫中有2個表。一個表是用於數據記錄,並具有以下欄目:可以進一步提高查詢性能(MySQL)

(讓這個被稱爲數據記錄器表)

ID - 主鍵

網站ID,設備ID,設備編號,設備參數,值,記錄日期

爲了從該表中選擇任何記錄,在where子句中使用列站點ID,設備ID,設備編號,設備參數以及指定日期範圍(記錄日期)。

其他表(讓這種被稱爲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 ';'ref';'rows';'Extra' '1';'SIMPLE';'logparam';'ref';'mibobjName_idx';'mibobjName_idx';'52';'const';'1';' ''where''

'1';'SIMPLE';'logtbl';'range';'loggertbl_combined_idx';'loggertbl_combined_idx';'69'; \ N;'528604';'Using where;使用加入緩衝區'

+1

編輯您的問題與解釋計劃也。 – Mihai

+0

在查詢前添加'explain'並將其結果添加到帖子中請 – Alexey

+0

如果您提供'SHOW CREATE TABLE',那麼它會更容易混淆,更準確。 –

回答

1

TL; DR;所以也許我錯過了一些東西在所有空話有用..,

無論如何,在一個複合索引...

site_id 
equipment_number 
cmd_name 
date_logged 

...似乎最可取的 - 以及在上cmd_name指數其他表。

您可以嘗試以確定這是最有效的

+1

只要日期是最後一次,logtbl的組合索引可以按任意順序排列。 –

+0

@rickjames的基數有什麼區別? – Strawberry

+0

流行的神話。在多列索引中,基數不重要。唉,對於我的說法,我沒有任何「證據」,只是提出了思考BTree如何工作的想法。日期(作爲範圍使用)必須是最後的,因爲範圍之後沒有任何索引部分將用於過濾。 –

0

在MySQL Workbench中執行這個查詢重新排列複合索引的順序。

EXPLAIN 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' 

這將幫助您調整索引。如果有表掃描,可能您的複雜索引包括錯誤順序的列。無論如何,EXPLAIN會告訴你是否可以進一步改進。