繁体   English   中英

查询性能能否进一步提高(MySQL)

[英]Can the query performance be further improved (MySQL)

我在MySQL数据库中有2个表。 一个表用于数据记录,并包含以下列:

(将此称为数据记录器表)

id-主键

站点ID,设备ID,设备编号,设备参数,值,记录日期

为了从该表中选择任何记录,在where子句中使用了站点ID,设备ID,设备编号,设备参数列以及指定日期范围(记录的日期)。

另一个表(此表称为loggerparameterdetails表)具有以下列:

设备ID设备参数-这2是复合主键

参数说明和参数单位是此表中的其他列

数据记录器表具有大量记录(逐年记录数将为一百万条记录)。 出于应用程序报告的目的,我将数据记录器表与参数名称上的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';'table';'type';'possible_keys';'key';'key_len';'ref';'rows';'Extra''1';'SIMPLE';'logparam' ;'ref';'mibobjName_idx';'mibobjName_idx';'52';'const';'1';'在哪里使用'

'1';'SIMPLE';'logtbl';'range';'loggertbl_combined_idx';'loggertbl_combined_idx';'69'; \\ N;'528604';'在何处使用; 使用连接缓冲区”

TL; DR; 所以也许我错过了所有这些有用的东西。

无论如何,...的综合指数

site_id
equipment_number
cmd_name
date_logged

...似乎是最可取的-以及另一个表上cmd_name的索引。

您可以尝试重新排列复合索引的顺序,以确认哪种方法最有效

在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都会告诉您是否有可能进一步改进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM