可以进一步改进查询性能(MySQL)

时间:2017-05-25 05:55:48

标签: mysql performance

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

(将其称为数据记录表)

id - 主键

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

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

另一个表(让我们称之为loggerparameterdetails表)包含以下列:

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

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

数据记录器表有大量记录(年度记录计数约为一百万条记录)。对于应用程序报告目的,我将数据记录器表与参数名称上的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&#39 ;;' SELECT_TYPE&#39 ;;'表&#39 ;;'类型&#39 ;;' possible_keys&#39 ;;&# 39;键&#39 ;;' key_len&#39 ;;' REF&#39 ;;'行&#39 ;;'额外' ' 1&#39 ;;' SIMPLE&#39 ;;' logparam&#39 ;;' REF&#39 ;;' mibobjName_idx&#39 ;;' mibobjName_idx& #39;;' 52';' const';' 1';'使用where'

' 1&#39 ;;' SIMPLE&#39 ;;' logtbl&#39 ;;'范围&#39 ;;' loggertbl_combined_idx&#39 ;;&# 39; loggertbl_combined_idx';' 69'; \ N;' 528604';'使用where;使用连接缓冲区'

2 个答案:

答案 0 :(得分:1)

TL; DR;所以也许我错过了一些有用的东西......,

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

UIImageView

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

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

答案 1 :(得分: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会告诉您是否可以进一步改进。

相关问题