2017-05-25 60 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会告诉你是否可以进一步改进。