[英]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.