我在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;使用连接缓冲区'
答案 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会告诉您是否可以进一步改进。